如何安全地打破单片mkYesod块

Mic*_*ael 2 haskell module hierarchy yesod

这个问题更能帮助我理解Yesod而不是其他任何东西.以http://www.yesodweb.com/book/basics为例,特别是mkYesod TH函数生成的代码.

我认为的问题是这个TH生成路由数据类型(数据路由HelloWorld = HomeR)和调用getHomeR等的yesodDispatch函数.

难点在于,在较大的项目中,您不能将getHomeR的定义拆分为单独的模块,因为Haskell的简单模块系统是严格分层的; 因此,如果getHomeR简称getHomeRimplementation这是在另一个模块中定义(比如HomeImplementation),那么该模块将需要导入的定义数据路由的HelloWorld和将有循环依赖关系.

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

JP *_*mau 7

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

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

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