【发布时间】:2016-06-19 19:52:03
【问题描述】:
请记住,我从未成功理解什么是单子,我对 Yesod 有疑问。我有一个需要在多个处理程序中使用的表单,所以我试图在一个可以在需要时导入的模块中定义它。该表单使用一堆未导出的函数来创建自定义字段。 当尝试像我在处理程序中习惯的那样运行简单的数据库操作时(尝试获取字段的默认值),我收到以下错误:
Couldn't match expected type ‘Maybe (Entity Client)’
with actual type ‘HandlerT site0 IO (Maybe (Entity Client))’
In a stmt of a 'do' block: runDB $ selectFirst [ClientId ==. id] []
In the expression: do { runDB $ selectFirst [ClientId ==. id] [] }
In a case alternative:
Just id -> do { runDB $ selectFirst [ClientId ==. id] [] }
我尝试了很多东西,使用
我有多个处理程序导入该模块,调用该函数以生成 AForm,如果这很重要的话。
非常感谢!
编辑: 这是引发该错误的函数:
getClientFromId :: Maybe (Key Client) -> Maybe (Entity Client)
getClientFromId mId = do
case mId of
Nothing -> Nothing
Just id -> do
runDB $ selectFirst [ClientId ==. id] []
更新
所以在阅读了答案后,我尝试删除签名:没有变化。 我尝试使用不同的建议签名,但没有任何效果。这是我目前拥有的:
getClientFromId :: Maybe (Key Client) -> Handler (Maybe (Entity Client))
getClientFromId mId = do
case mId of
Nothing -> return Nothing
Just id -> do
client <- runDB $ selectFirst [ClientId ==. id] []
return client
我从 AForm 定义中的三元组调用它:
<*> (fmap entityKey <$> aopt clientIdField (addIdToField "ClientIdField" (bfs ("Owner" :: Text))) (isJust mHorse ? (Just (getClientFromId $ horseClient $ fromJust mHorse)) :? Nothing))
三元组不是很容易阅读,如果我弄清楚如何完成所有这些工作,我可能会改变它:)。 我得到那个错误:
Couldn't match type ‘HandlerT App IO (Maybe (Entity Client))’
with ‘Maybe (Entity Client)’
Expected type: Maybe (Entity Client)
Actual type: Handler (Maybe (Entity Client))
In the first argument of ‘Just’, namely
‘(getClientFromId $ horseClient $ fromJust mHorse)’
In the first argument of ‘(:?)’, namely
‘(Just (getClientFromId $ horseClient $ fromJust mHorse))’
In the second argument of ‘(?)’, namely
‘(Just (getClientFromId $ horseClient $ fromJust mHorse))
:? Nothing’
看起来,我似乎有正确的返回类型,除了它上面有一个“HandlerT site0 IO”。我尝试使用带有
(我知道这是嵌套多个 Maybe,但在我的 DB horseClient 中是一个 Maybe,并且表单的默认值正在等待一个 Maybe,因此最终值应该是一个 Maybe 似乎是“正常的”(Maybe (实体客户端))即使这有点奇怪)
【问题讨论】:
-
如果您提供更多代码,我相信我们可以提供帮助。尝试构建能显示该问题的最小示例。
-
我在原帖中添加了这个功能