gpt4 book ai didi

haskell - 无法在 Yesod 子站点小部件中使用类型安全的路由

转载 作者:行者123 更新时间:2023-12-02 01:44:00 24 4
gpt4 key购买 nike

我正在为我的毕业实习开发一个基于 Yesod 的 CMS。目前我们正在使用一个子站点 ( Core ) 来表示管理区域,这个 Core应该在项目之间可重用,因此它与主站点分开并拥有自己的存储库。应该可以包含其他子站点以集成到 Core 中.这些其他子站点都应该能够使用相同的(管理)布局。

我们使用的存储库是:
CMS 核心:https://github.com/lambdacms/lambdacms-core/tree/extensions
CMS 媒体扩展:https://github.com/lambdacms/lambdacms-media
演示 Yesod 大师:https://github.com/lambdacms/ponycms/tree/media

请注意,有指向特定分支的 url 链接,这些是我当前正在使用的分支。

最初我使用函数 lambdaCoreLayout (在 Foundation.hs 中找到)为 Core 中的所有处理程序提供正确的布局本身。但是我无法在其他子站点中使用此功能。我添加了函数 tryoutLayout,而不是重写已经工作的内容。 (在同一文件中找到)适用于所有子站点并且非常类似于 defaultLayoutSub (与 Yesod 一起提供)。但是它不允许我使用 getRouteToParent在任何处理程序中向小部件添加类型安全路由。

以下面的片段为例:

getAdminHomeR :: CoreHandler Html
getAdminHomeR = do
tp <- getRouteToParent
tryoutLayout [whamlet|@{tp AdminHomeR}|]

这给了我以下错误:

Could not deduce (master ~ Core)
from the context (LambdaCmsAdmin master)
bound by the type signature for
getAdminHomeR :: LambdaCmsAdmin master =>
HandlerT Core (HandlerT master IO) Html
at LambdaCms/Core/Handler/Home.hs:17:18-33
‘master’ is a rigid type variable bound by
the type signature for
getAdminHomeR :: LambdaCmsAdmin master =>
HandlerT Core (HandlerT master IO) Html
at <no location info>
Expected type: WidgetT
Core
IO
(yesod-core-1.4.2:Yesod.Routes.Class.Route master
-> [(Text, Text)] -> Text)
Actual type: WidgetT
Core
IO
(yesod-core-1.4.2:Yesod.Routes.Class.Route
(HandlerSite (WidgetT Core IO))
-> [(Text, Text)] -> Text)
Relevant bindings include
tp :: yesod-core-1.4.2:Yesod.Routes.Class.Route Core
-> yesod-core-1.4.2:Yesod.Routes.Class.Route master
(bound at LambdaCms/Core/Handler/Home.hs:20:3)
getAdminHomeR :: HandlerT Core (HandlerT master IO) Html
(bound at LambdaCms/Core/Handler/Home.hs:19:1)
In the first argument of ‘(>>=)’, namely ‘getUrlRenderParams’
In the first argument of ‘tryoutLayout’, namely
‘((getUrlRenderParams
>>=
(\ urender_agTZ
-> (asWidgetT . toWidget)
(toHtml (\ u_agU0 -> urender_agTZ u_agU0 [] (tp AdminHomeR))))))’

如果我是正确的,这个错误表明 getRouteToParent试图返回一个试图生成 Route Core 的函数而不是 Route master .我尝试了不同的地方来放置 tp <- getRouteToParent但我无法让它工作。

我自己对 Haskell 和 Yesod 的了解有限,我无法找到正确方向的解决方案或指示。是否有我遗漏的东西,或者是否有其他方法可以解决这个问题?

最佳答案

您希望您的 tryoutLayout 函数采用 WidgetT master IO () 类型的值,而不是 WidgetT Core IO (),以允许你嵌入主站点路由。

关于haskell - 无法在 Yesod 子站点小部件中使用类型安全的路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26803487/

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