gpt4 book ai didi

haskell - 带有消化函数的复选框列表

转载 作者:行者123 更新时间:2023-12-03 03:23:49 25 4
gpt4 key购买 nike

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

[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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com