2016-10-18 82 views
0

我試圖讓我的頭繞過序列函數。我認爲這可能會有所幫助,如果我把它作爲一個遞歸函數來寫的話,但是我認爲它是一個單調的表達式,我覺得有點難以轉換爲遞歸,所以我有點不知所措。我的意思是你用return(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

好的,請檢查Traversable,這正是我所需要的。 – user1897830