Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何将路由放在一个模块中,将处理程序放在另一个模块中_Haskell_Yesod - Fatal编程技术网

Haskell 如何将路由放在一个模块中,将处理程序放在另一个模块中

Haskell 如何将路由放在一个模块中,将处理程序放在另一个模块中,haskell,yesod,Haskell,Yesod,我有一个YesSOD应用程序,其中应用程序的整个web部分都定义在一个文件中,并且它的大小已经发展到我需要将内容分离出来的程度 我想建立一个像这样的雇佣关系: web/Handlers/Group1 Group2 web/Foundation web/Main 这与Haskellers网站的代码设置类似。然而,我不知道Haskellers网站是如何运作的。当我设置时,GROP1中的处理程序需要导入Foundation来获取基础类并获取其他路由列表,因为我的一些处理程序

我有一个YesSOD应用程序,其中应用程序的整个web部分都定义在一个文件中,并且它的大小已经发展到我需要将内容分离出来的程度

我想建立一个像这样的雇佣关系:

web/Handlers/Group1
             Group2
web/Foundation
web/Main
这与Haskellers网站的代码设置类似。然而,我不知道Haskellers网站是如何运作的。当我设置时,GROP1中的处理程序需要导入Foundation来获取基础类并获取其他路由列表,因为我的一些处理程序重定向到应用程序的不同部分。但是我的基金会不会编译,因为它想找到在GROP1、GROP2等中定义的路由处理程序< /P> 这迫使我进行循环导入,这显然行不通。当我读取HaskeleS代码时,基础模块不导入任何处理模块。

让这项工作成功的诀窍是什么

更新

根据Michael Snoyman的回答,我已经将对mkYesod的呼叫替换为对MyYesOData和mkYesodDispatch的单独呼叫。当然,GHC会抱怨,如果我在一个文件中同时做这两件事,那么我会在重构的第一阶段将内容分离出来:

我从Main.hs获得的所有代码,也就是应用程序web部分的所有代码,我移动到了WebApp.hs 我将main函数从WebApp.hs移回main.hs 在WebApp.hs中,我调用mkYesodData 在Main.hs中,我呼叫mkYesodDispatch 链接器现在失败了。编译Main时,它在导入列表中找到的第一个模块(它位于此项目中,而不是库中)无法链接,如下所示:

web/Main.hs:1:1:
    cannot find normal object file `dist/build/invoicedb/invoicedb-tmp/WebApp.o'
    while linking an interpreted expression
如果我删除mkYesodDispatch和mkYesodData并返回到mkYesod,即使使用相同的文件结构,构建也会顺利进行

因此,要回顾一下,以下是我的文件:

web/Main.hs:

主要功能 给mkYesodDispatch的电话 配置/路由:

纯文本路由,就像在scaffold应用程序中一样 web/WebApp.hs:

我的应用程序结构 MKYESODATA 应用程序实例 实例YesDouth应用程序 实例RenderMessage应用程序FormMessage 我所有的路由处理程序 我创建了一个简单的例子来说明这个问题:

如果编辑代码,在DSPACHCH.HS中注释MKEESOTDRISH,并在Foundation.hs中用MKEESOD替换MKEESODATA,则代码将成功编译。


注意,我使用的是yesod-1.2.4。如果1.2.6解决了这个问题,那么我将升级我的团队。

我猜您的代码正在使用对mkYesod的调用。为了将一个模块拆分为多个模块,您需要使用mkYesodData,mkyesodas是在scaffolding站点中完成的。有关这方面的更多信息,请参阅。将此技术应用于现有的代码库应该不会太困难。

我猜您的代码正在使用对mkYesod的调用。为了将一个模块拆分为多个模块,您需要使用mkYesodData,mkyesodas是在scaffolding站点中完成的。有关这方面的更多信息,请参阅。将此技术应用于现有的代码库应该不会太困难。

这看起来像是.cabal文件中的一个bug。确保您告诉cabal您正在使用模板Haskell:

executable yesod-decomposition
   ..
   other-extensions: TemplateHaskell

这样它就知道如何以正确的顺序构建正确的对象文件。

这看起来像是.cabal文件中的一个bug。确保您告诉cabal您正在使用模板Haskell:

executable yesod-decomposition
   ..
   other-extensions: TemplateHaskell

这样它就知道如何以正确的顺序构建正确的对象文件。

您是否使用脚手架?不适用于此项目。我认为脚手架将帮助您。您可以将所有路由放在config/route文件中。所有处理程序都位于处理程序文件夹下。Yesod有自动添加处理程序的命令。我已经有上千行代码,没有时间过渡到一个全新的体系结构。你在使用脚手架吗?不是为了这个项目。我认为脚手架将帮助你。您可以将所有路由放在config/route文件中。所有处理程序都位于处理程序文件夹下。Yesod有自动添加处理程序的命令。我已经有超过一千行的代码了,没有时间过渡到一个全新的体系结构。