一旦使用直接樣式,一次使用foldr,一次使用列表解析編寫concatMap的函數。在Haskell中編寫concatMap的函數
以下功能是我寫的foldr相似,但它也存在一些問題。**
concatMap' :: (a -> [b]) -> [a] ->[b]
concatMap' f []=[]
concatMap' f (x:xs)==foldr (\x acc->acc : f x) [] xs
一旦使用直接樣式,一次使用foldr,一次使用列表解析編寫concatMap的函數。在Haskell中編寫concatMap的函數
以下功能是我寫的foldr相似,但它也存在一些問題。**
concatMap' :: (a -> [b]) -> [a] ->[b]
concatMap' f []=[]
concatMap' f (x:xs)==foldr (\x acc->acc : f x) [] xs
既然你都應該使用foldr
,你會不會寫的concatMap'
一個明確的遞歸定義。因此,你只需要一個定義。要使用foldr
,請考慮累加器將包含的內容。迭代之間需要保持什麼樣的狀態?每個列表元素的狀態如何更新?最終的價值應該是什麼?你可能想直接編寫代碼(你提到的也是你的任務的一部分),這樣你就可以詳細瞭解遞歸,然後嘗試將其與foldr
的定義相匹配(其源代碼位於Haskell 98規範或您可以搜索它)。
foldr op z [ a', b', c', d', .. ]
== a' `op` b' `op` c' `op` d' `op` .. `op` z
什麼價值op
,z
和[ a', b', c', d', .. ]
會使結果看起來像concatMap f [a, b, c, d, ..]
預期的結果?