一旦使用直接样式,一旦使用foldr和一次使用列表推导来编写concatMap的功能。
以下函数我是由foldr编写的,但它有一些问题。**
concatMap' :: (a -> [b]) -> [a] ->[b]
concatMap' f []=[]
concatMap' f (x:xs)==foldr (\x acc->acc : f x) [] xs
答案 0 :(得分:2)
由于您应该使用foldr
,因此您不会编写concatMap'
的显式递归定义。因此,您只需要一个定义。要使用foldr
,请考虑累加器将包含的内容。迭代之间需要保持什么样的状态?如何为每个列表元素更新该状态?返回的最终值应该是多少?您可能希望首先以直接样式编写代码(您提到的也是您的任务的一部分),以便您详细了解递归,然后尝试将其与foldr
的定义相匹配(其源代码是在Haskell 98规范中,您可以搜索它。)
答案 1 :(得分:0)
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, ..]
的预期结果?