我正在尝试selectFieldList在子站点表单内使用,但出现以下错误:
Couldn't match type 'IO' with 'HanderT master IO'
我在使用以下代码片段时遇到了这个问题,其中子站点被命名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}|]
when the select field is replaced with for instance an intFieldthe form and handler work as expected. 在寻找selectFieldListHoogle 时,我发现选项字段(选择、单选、复选框)与“正常”字段具有不同的签名(如下所示)。我怀疑这种差异是问题所在,但还没有找到解决方法,而不必完全实现选项字段。
选项字段签名:
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
有没有办法让选项字段在子站点上下文中工作,而无需重新实现它们?