【问题标题】:Digestive-functors and listOf消化函子和 listOf
【发布时间】:2015-08-11 17:35:11
【问题描述】:

我已经能够在 snap 应用程序中成功地使用带有简单表单的 digestive-functors;但是,我在尝试处理隐藏输入列表时遇到了困难。关于如何使用listOf,有些事情我不太了解。谁能指出我正确的方向?谢谢。

上一页呈现的 html 包含以下隐藏字段:

<div id='messageForm.recipients' class='inputList'>
  <input type='hidden' name='messageForm.recipients.indices' value='0' />
  <input type='hidden' id='messageForm.recipients.-1.email' name='messageForm.recipients.-1.email' value />
  <input type='hidden' id='messageForm.recipients.0.email' name='messageForm.recipients.0.email' value='emai1l@email.com' /> 
  <input type='hidden' id='messageForm.recipients.1.email' name='messageForm.recipients.1.email' value='email2@email.com' /> 
</div>

数据类型有:

data ConfirmMessage = ConfirmMessage {
  isoDate :: T.Text,
  subject :: T.Text,
  body    :: T.Text,
  action  :: T.Text,
  recipients :: [Recipient]
} deriving (Show) 

data Recipient = Recipient {
  email :: T.Text 
} deriving (Show)

表格有:

messageForm :: (Monad m) => Form T.Text m ConfirmMessage
messageForm = ConfirmMessage
  <$> "isoDate"    .: stringRead "Missing ISOdate" Nothing
  <*> "subject"    .: stringRead "Subject required" Nothing
  <*> "body"       .: stringRead "Body required" Nothing
  <*> "action"     .: stringRead "Missing action" Nothing
  <*> "recipients" .: listOf recipientForm' Nothing

recipientForm' :: (Monad m) => Formlet T.Text m Recipient
recipientForm'= Recipient
  <$> "email"      .: text Nothing

我得到的错误信息是:

Couldn't match type `Text.Digestive.Form.Internal.FormTree
                       m0 v0 m0 Recipient'
              with `Maybe Recipient -> Form T.Text m Recipient'
Expected type: Formlet T.Text m Recipient
  Actual type: Text.Digestive.Form.Internal.FormTree
                 m0 v0 m0 Recipient
Relevant bindings include
  recipientForm' :: Formlet T.Text m Recipient
    (bound at src/Handler/TradeNotifyConfirm.hs:191:1)
In the expression: Recipient <$> "email" .: text Nothing
In an equation for `recipientForm'':
    recipientForm' = Recipient <$> "email" .: text Nothing

【问题讨论】:

    标签: haskell haskell-snap-framework digestive-functors


    【解决方案1】:

    好的免责声明:我从未使用过digestive-functors,但这是我处理此类问题的方法:

    1) 您的错误消息显示Expected type: Formlet T.Text m RecipientActual type: Text.Digestive.Form.Internal.FormTree m0 v0 m0 Recipient

    2)查看文档并看到:

    type Formlet v m a = Maybe a -> Form v m a 
    type Form v m a = FormTree m v m a
    

    所以我们从上面扩展预期得到:

    Formlet T.Text m Recipient 
    -- v ~ T.Text, a ~ Recipient
    Maybe Recipient -> Form T.Text m Recipient
    --
    Maybe Recipient -> FormTree m T.Text m Recipient
    

    现在再看一遍:

    • 预期类型:Maybe Recipient -&gt; FormTree m T.Text m Recipient
    • 实际类型:FormTree m0 v0 m0 Recipient

    我们缺少Maybe Recipient!根据我在上面看到的情况,我猜您只想忽略该论点,因此我们有:

    recipientForm' :: (Monad m) => Formlet T.Text m Recipient
    recipientForm' _ = Recipient <$> "email" .: text Nothing
    

    编译得很好,耶:)

    【讨论】:

    • 太棒了,谢谢...扩展预期类型的​​方法非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2013-04-21
    • 2012-09-27
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多