2016-10-18 21 views
0

私はシーケンス関数を頭に入れようとしています。私はそれを再帰関数として書いておけば助けになると思っていましたが、再帰的に変換するのがやや難しいモナド式であると考えて、それをどうやって行うのか少し迷っています。私は返品(x:xs)で何をしているのですか?言い換えれば、私はfoldrなしで関数を記述したいと思います。シーケンス関数をfoldrから再帰関数に変更する

sequence _ = foldr k (return []) 
       where 
       k m m' = do { x <- m; xs <- m'; return (x:xs) } 

sequence' _ = foldr k (return []) 
       where 
        k m m' = m >>= 
          (\fstr -> m'>>= 
          (\rstr -> return (fstr:rstr))) 
+0

あなたが求めているものは明らかではありません。 – user2297560

+0

foldrなしで関数を書くにはどうしたらいいですか? – user1897830

+1

私なしで関数を書かないでください。 :( – rightfold

答えて

3

sequenceを書くための一つの方法は、単にtraverse idある、と私はより深く理解するためTraversableApplicativeとの間の関係を探求することをお勧めします:私は、以下の二つの定義が含まれています。

私は、あなたが探していることは、この定義だと思う:

sequence :: Monad m => [m a] -> m [a] 
sequence [] = return [] 
sequence (x:xs) = do 
    x' <- x 
    xs' <- sequence xs 
    return (x':xs') 
+0

Ok。Traversableをチェックします。それが私が探していたものでした。 – user1897830