[英]List of checkboxes with digestive-functors
如何使用消化函數創建一個具有以編程方式生成的復選框列表的表單,該表單將返回一個列表。 例如:
[x] Milk
[ ] Cereals
[x] Ground meat
將返回["Milk", "Ground meat"]
。
我期待類型會是這樣的:
form :: (Functor m, Monad m) => [String] -> HappstackForm m Html BlazeFormHtml [String]
沒有標准的方法可以這樣做,但是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] -> [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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.