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,ParseRoute和YesodDispatch实例,则可以避免这种情况; 然后RenderRoute可以位于导入层次结构的底部,而YesodDispatch位于顶部.那有意义吗 ?也许我问这个问题的事实表明我对mkYesod TH 不了解 ; 例如,存在一些重要的相互关系,它们不应该分开.
你是对的,但在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.你会看到那里的多模块方法.