2017-11-02 1 views
1

のは、私が Haskellで任意の数のMonadをどのようにモナド化するのですか?

x :: Monad a => [a] 
x = [item1, item2, item3, ...] 

があるとしましょうそして私はこれらのために何をしたい:

zipf' x (y:z) = getZipList $ foldl (<*>) (x <$> y) z 

しかし、残念ながら:

y f = f <$> item1 <*> item2 <*> item3 <*> item4 <*> ... 

は、以前私がZipListsでそれを行うためにこれを試してみました返された:

<interactive>:94:36: error: 
• Occurs check: cannot construct the infinite type: a1 ~ a -> a1 
    Expected type: ZipList a1 -> ZipList a -> ZipList a1 
    Actual type: ZipList (a -> a1) -> ZipList a -> ZipList a1 
• In the first argument of ‘foldl’, namely ‘(<*>)’ 
    In the second argument of ‘($)’, namely ‘foldl (<*>) (x <$> y) z’ 
    In the expression: getZipList $ foldl (<*>) (x <$> y) z 
• Relevant bindings include 
    z :: [ZipList a] (bound at <interactive>:94:12) 
    y :: ZipList a (bound at <interactive>:94:10) 
    x :: a -> a1 (bound at <interactive>:94:7) 
    zipf' :: (a -> a1) -> [ZipList a] -> [a1] 
     (bound at <interactive>:94:1) 
+1

は私に 'sequence'のように見えます –

+0

@ n.m。そのコメントを回答にプロモートする必要があります。 –

+0

これは実際には「シーケンス」ではありませんか?私たちは 'm [a]'を望んでいないので、おそらく 'foldM'のようなもので折りたたみたいと思っていますが、質問で与えられた型が不可能であるために伝えるのは難しいです。 – amalloy

答えて

3

タイプ

x :: Monad a => [a] 

は不可能です:モナドは型パラメータを必要とするので、あなたは、そのようなものを持つことはできません。あなたはおそらくその後

x :: Monad m => [m a] 

を意味し、次の問題がある:yの種類は何ですか?それは関数fを受け取り、fは何とか任意の数の引数を受け入れますか?それは正しいとは言えません。なぜGHCは無限のタイプについて文句を言うのですか:fのタイプはサブタイプとしてfのタイプをそれ自身含んでいなければなりません。

おそらくfoldMのようなものを意味しますか?結局のところ、foldMが必要なのかどうかに関わらず、正しいタイプの機能を見つけたら、検索は簡単になります。

関連する問題