【问题标题】:List of checkboxes with digestive-functors带有消化功能的复选框列表
【发布时间】:2011-06-22 07:14:29
【问题描述】:

如何使用消化函子来创建一个表单,该表单具有以编程方式生成的复选框列表,该列表将返回一个列表。例如:

[x] Milk
[ ] Cereals
[x] Ground meat

将返回["Milk", "Ground meat"]

我希望类型是这样的:

form :: (Functor m, Monad m) => [String] -> HappstackForm m Html BlazeFormHtml [String]

【问题讨论】:

    标签: haskell digestive-functors


    【解决方案1】:

    没有标准的方法可以做到这一点,但digestive-functors 可以使用Applicative 接口进行高度组合,因此您可以轻松创建所需的内容。

    您可以定义一个checkBox,它返回一个Maybe String,即元素的名称(如果它被选中)。

    checkBox :: (Functor m, Monad m)
             => String -> HappstackForm m Html BlazeFormHtml (Maybe String)
    checkBox str = fmap maybeStr (inputCheckBox False) <++ label str
      where
        maybeStr True  = Just str
        maybeStr False = Nothing
    

    然后,您可以遍历字符串列表,为列表中的每个元素创建一个像这样的复选框:

    listForm' :: (Functor m, Monad m)
              => [String]
              -> HappstackForm m Html BlazeFormHtml [Maybe String]
    listForm' = foldr (\x xs -> fmap (:) x <*> xs) (pure []) . map checkBox
    

    catMaybes :: [Maybe a] -&gt; [a] 帮助您进一步减少结果:

    listForm :: (Functor m, Monad m)
             => [String]
             -> HappstackForm m Html BlazeFormHtml [String]
    listForm = fmap catMaybes . listForm'
    

    最后,我们可以实例化实际的表单:

    food :: [String]
    food = ["Milk", "Cereals", "Ground meat"]
    
    foodForm :: (Functor m, Monad m)
             => HappstackForm m Html BlazeFormHtml [String]
    foodForm = listForm food
    

    【讨论】:

    • listForm' 可以更简单地使用Data.Traversable 写成listForm' = traverse checkBox
    猜你喜欢
    • 2019-07-01
    • 2011-06-20
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多