gpt4 book ai didi

haskell - 如何安全地分解单一的 mkYesod block

转载 作者:行者123 更新时间:2023-12-02 15:26:59 25 4
gpt4 key购买 nike

这个问题比什么都更能帮助我理解Yesod。以 http://www.yesodweb.com/book/basics 为例尤其是 mkYesod TH 函数生成的代码。

我发现的问题是这个 TH 生成了路由数据类型(data Route HelloWorld = HomeR)和 yesodDispatch 函数它调用 getHomeR

困难在于,在一个较大的项目中,您不能将 getHomeR 的定义拆分成一个单独的模块,因为 Haskell 的简单模块系统是严格分层的;因此,如果 getHomeR 只是简单地调用了在另一个模块(例如 HomeImplementation)中定义的 getHomeRimplementation,那么该模块将需要导入 的定义data Route HelloWorld 会产生循环依赖。

在我看来,如果可以在单独的模块中声明 RenderRouteParseRouteYesodDispatch 实例,则可以避免这种情况;然后 RenderRoute 可能位于导入层次结构的底部,YesodDispatch 位于顶部。那有意义吗 ?也许我问这个问题的事实表明我对 mkYesod TH 不太了解;例如,存在一些至关重要的相互关系,不应将它们分开。

最佳答案

你是对的,但这一点在 yesod 书中也有提到。例如看看 http://www.yesodweb.com/book/scaffolding-and-the-site-template ,名为“基础和应用程序模块”的部分。通常,您有一个定义路由类型和处理函数的基础模块,以及一个定义调度的应用程序模块。因此,您所有的处理程序模块都导入了 Foundation,而 Application 导入了您所有的处理程序模块和 Foundation。没有循环!

您可能也有兴趣阅读 http://www.yesodweb.com/blog/2012/10/yesod-pure , 关于在没有 TH 的情况下使用 Yesod。

查看 Github 中的示例 yesod 应用程序。例如,我在 https://github.com/JPMoresmau/mangopay/tree/master/yesod-mangopay/app 开发了一个简单的 Yesod 应用程序来演示电子支付。 .您会在那里看到多模块方法。

关于haskell - 如何安全地分解单一的 mkYesod block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29864470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com