プレリュード機能and :: [Bool] -> Bool
ほとんど何をしたいんが、それはモナドではありません。一般に、引数の1つの関数をモナドに持ち上げるには、Control.MonadのliftM :: Monad m => (a -> b) -> m a -> b a
が必要です。しかし、より一般的には、Preludeのfmap :: Functor f => (a -> b) -> f a -> f b
を使用することができます。すべてのモナドはファンクタなので、これは問題ありません。したがって、あなたはしかし
fand' :: Functor f => f [Bool] -> f Bool
fand' = fmap and
を使用することができ、時間の少なくとも90%が、私はちょうど
fmap
ためControl.Applicativeの
<$>
シノニムを使用して、よりおそらく
and <$> xs
fmap and xs
ように、そのインラインを書き、またはでしょう。
もちろん、私が気づいたように、これはあなたが望むものではありません。そのためには、Preludeのsequence :: Monad m => [m a] -> m [a]
が必要です。あなたは今の機能[m a] -> m [a]
、および機能f [Bool] -> f Bool
を持っているので、我々はこれらを組み合わせることができます。
mand :: Monad m => [m Bool] -> m Bool
mand = liftM and . sequence
ある意味でfmap
の 『よりよい』が、それは追加のFunctor m
を課す、ので、私はfmap
からliftM
に切り替え制約。そのは、は問題にならないはずですが、歴史的な理由からそうかもしれないので、私は安全にプレーしました。
また、「sequence
についてはどのように知りましたか」と問えるかもしれません。その答えは素晴らしいHoogleです。これにより、Haskell関数を名前またはで検索することができます。だから、あなたが約liftM :: Monad m => (a -> b) -> m a -> m b
を知っていたので、あなたはMonad m => [m a] -> m [a]
のようなものが必要であることに気づいたかもしれません。そのためのフーグリングdoes indeed turn up sequence
。
1:あるいは、少なくとも、彼らは被ためにすべき歴史的な理由で、しかし、これは必ずしもそうではありません。
ありがとう!しかし、次のように書かれています: "予想される型' m 'と推定型 '[]'をマッチさせることができませんでした。何が問題なの? – 4DA
@ドミトリー:私はタイプミスしているので私は 'mad :: Monad m => m [Bool] - > m Bool'を主張しました。この練習の*ポイント*は' Monad m => [m Bool ] - > m Bool'。そのタイプのアサーションを修正すると、すべてが機能します。私はそれに対応して私の答えを編集しました。 –