9

リストを返す、プログラムで生成されたチェックボックスのリストを持つフォームを作成するために、ダイジェスティブ ファンクターを使用するにはどうすればよいですか。例えば:

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

戻り["Milk", "Ground meat"]ます。

タイプは次のようになると予想しています。

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

1 に答える 1

14

これを行うための標準的な方法はありませんが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
于 2011-06-22T09:10:23.837 に答える