作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使用消化仿函数创建一个表单,该表单具有以编程方式生成的复选框列表,该列表将返回一个列表。例如:
[x] Milk
[ ] Cereals
[x] Ground meat
将返回[“牛奶”,“碎肉”]
。
我期望类型会是这样的:
form :: (Functor m, Monad m) => [String] -> HappstackForm m Html BlazeFormHtml [String]
最佳答案
没有标准方法可以做到这一点,但是 digestive-functors
使用 Applicative
接口(interface)可以高度组合,因此您可以轻松创建您想要的内容。
您可以定义一个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] -> [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
关于haskell - 带有消化函数的复选框列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6436238/
我试图用 Python 编写理论上的蛋白质序列胰蛋白 enzyme 切割代码。胰蛋白 enzyme 的切割规则是:在 R 或 K 之后,但不在 P 之前。(即胰蛋白 enzyme 在每个 K 或 R
我正在消化其他一些 zip 文件的内容以生成 MD5。文件内容被摘要并生成 MD5,而不是例如基于时间戳生成 MD5。因此,我断言两个文件具有相同的内容,即使它们是在不同时间生成的。因此,我编写了以下
我是一名优秀的程序员,十分优秀!