2011-01-25 86 views
0

一旦使用直接樣式,一次使用foldr,一次使用列表解析編寫concatMap的函數。在Haskell中編寫concatMap的函數

以下功能是我寫的foldr相似,但它也存在一些問題。**

concatMap' :: (a -> [b]) -> [a] ->[b] 
    concatMap' f []=[] 
    concatMap' f (x:xs)==foldr (\x acc->acc : f x) [] xs 

回答

2

既然你都應該使用foldr,你會不會寫的concatMap'一個明確的遞歸定義。因此,你只需要一個定義。要使用foldr,請考慮累加器將包含的內容。迭代之間需要保持什麼樣的狀態?每個列表元素的狀態如何更新?最終的價值應該是什麼?你可能想直接編寫代碼(你提到的也是你的任務的一部分),這樣你就可以詳細瞭解遞歸,然後嘗試將其與foldr的定義相匹配(其源代碼位於Haskell 98規範或您可以搜索它)。

0
foldr op z [ a', b', c', d', .. ] 
== a' `op` b' `op` c' `op` d' `op` .. `op` z 

什麼價值opz[ a', b', c', d', .. ]會使結果看起來像concatMap f [a, b, c, d, ..]預期的結果?