これを行うための標準的な方法はありませんがdigestive-functors
、インターフェイスを使用して非常に構成可能Applicative
であるため、必要なものを簡単に作成できます。
checkBox
を返すaを定義できます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