我很困惑在do-block中定義foldM
,主要是因爲它的遞歸。 foldM
的標準定義如下:Haskell:在do-notation中定義foldM
foldM :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
foldM _ a [] = return a
foldM f a (x:xs) = f a x >>= \fax -> foldM f fax xs
我明白這個定義;遞歸地將f a x
的結果傳遞給新的foldM
函數,直到列表爲空。這裏是一個做塊的foldM
定義(從我的UNI課程材料複製):
foldM _ z [] = return z
foldM f z (x:xs) = do r <- foldM f z xs
f r x
我知道do塊的定義基本上是綁定(>>=)
操作語法糖。但是,我似乎無法理解這個定義是如何工作的。我發現do-blocks中的遞歸非常混亂。什麼給r
?遞歸線r <- foldM f z xs
如何通過foldM
傳遞z
每次遞歸調用?不應該像f z x
那樣通過遞歸更新的參數,如foldM
定義(>>=)
?
在課程材料中的定義定義了一個不同的功能,可以做別的事情。你是對的懷疑。我挑戰你通過調用每個參數並獲得不同的結果來證明它們不同。 – dfeuer
我還挑戰你寫一個'''基於'的'foldM'的版本,這個版本相當於通常的定義。 – dfeuer