【发布时间】:2015-01-15 15:55:37
【问题描述】:
我正在尝试在子网站表单中使用 selectFieldList,但出现以下错误:
Couldn't match type 'IO' with 'HanderT master IO'
我在使用以下 sn-ps 时遇到了这个问题,其中子站点命名为 TestSub(此子站点与主站点分离):
类型:
type TestHandler a = forall master. Yesod master
=> HandlerT TestSub (HandlerT master IO) a
type Form a = forall master. Yesod master
=> Html -> MForm (HandlerT TestSub (HandlerT master IO)) (FormResult a, WidgetT TestSub IO ())
表单和处理程序:
testForm :: Form (Text, Int)
testForm = renderBootstrap3 BootstrapBasicForm $ (,)
<$> areq textField (bfs MsgText) Nothing
<*> areq (selectFieldList [(MsgFirst, 1), (MsgSecond, 2)]) (bfs MsgSelect) Nothing
getTestHome :: TestHandler Html
getTestHome = do
(formWidget, _) <- generateFormPost testForm
defaultLayoutSub $ do
setTitleI MsgTest
[whamlet|^{formWidget}|]
当SELECT字段替换为例如intField表单和处理程序按预期工作。在 Hoogle 上寻找 selectFieldList 时,我发现选项字段(选择、单选、复选框)与“正常”字段具有不同的签名(如下所示)。我怀疑这种差异是问题所在,但还没有找到解决方法,而不必完全实现选项字段。
选项字段签名:
selectFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg)
=> [(msg, a)]
-> Field (HandlerT site IO) a
普通字段签名:
intField :: (Monad m, Integral i, RenderMessage (HandlerSite m) FormMessage)
=> Field m i
有没有办法让选项字段在子站点上下文中工作,而无需重新实现它们?
【问题讨论】:
标签: haskell yesod yesod-forms