Haskell 没有哈姆雷特的一元形式的创造

Haskell 没有哈姆雷特的一元形式的创造,haskell,yesod,Haskell,Yesod,我的目标是写一个不使用哈姆雷特的单子形式 假设我有这样的示例形式: userForm :: Maybe User -> Html -> MForm Handler (FormResult User, Widget) userForm u extra = do (nameR, nameV) <- mreq textField "" (userName <$> u) (passR, passV) <- mreq passwordField "" Nothi

我的目标是写一个不使用哈姆雷特的单子形式

假设我有这样的示例形式:

userForm :: Maybe User -> Html -> MForm Handler (FormResult User, Widget)
userForm u extra = do
  (nameR, nameV) <- mreq textField "" (userName <$> u)
  (passR, passV) <- mreq passwordField "" Nothing
  let userRes = User <$> nameR <*> passR
  let widget = do
    toWidget $ \render -> do
      extra
      -- fvInput nameV?
      -- fvInput passV?
      H.input ! type_ "submit" ! value "Submit"
  return (userRes, widget)
但是fvInput的返回类型是
FieldView App
,我需要将其转换为Html以与blaze很好地组合


也许,在这个任务中使用输入表单会更容易(即,在没有w/hamlet的情况下实现表单),但是YesDobook上的文档说它没有正确处理错误的输入案例。我倾向于在这里使用一元形式,因为我希望在验证失败的情况下“免费”重新创建用户输入。它会这样工作吗?

使用
lift
widgetopagecontent

userForm :: Maybe MyUser -> Html -> MForm Handler (FormResult MyUser, Widget)
userForm u extra = do
  (nameR, nameV) <- mreq textField "" (myUserName <$> u)
  (passR, passV) <- mreq passwordField "" Nothing
  nameContents <- lift $ widgetToPageContent (fvInput nameV)
  passContents <- lift $ widgetToPageContent (fvInput passV)
  let userRes = MyUser <$> nameR <*> passR
  let widget = do
        toWidget $ \render -> do
          extra
          pageBody nameContents render
          pageBody passContents render
          H.input H.! A.type_ "submit" H.! A.value "Submit"
  return (userRes, widget)
userForm::Maybe MyUser->Html->MForm处理程序(FormResult MyUser,小部件)
userForm u extra=do

(nameR,nameV)你能告诉我
userForm
的类型是什么吗?它是
Maybe-User->Html->MForm-Handler(FormResult-User,Widget)
。第一个参数是用于填充已存储数据的用户实例,第二个参数是
extra
value。我已经编辑了一点post示例。
userForm :: Maybe MyUser -> Html -> MForm Handler (FormResult MyUser, Widget)
userForm u extra = do
  (nameR, nameV) <- mreq textField "" (myUserName <$> u)
  (passR, passV) <- mreq passwordField "" Nothing
  nameContents <- lift $ widgetToPageContent (fvInput nameV)
  passContents <- lift $ widgetToPageContent (fvInput passV)
  let userRes = MyUser <$> nameR <*> passR
  let widget = do
        toWidget $ \render -> do
          extra
          pageBody nameContents render
          pageBody passContents render
          H.input H.! A.type_ "submit" H.! A.value "Submit"
  return (userRes, widget)