在Haskell中编写concatMap的功能

时间:2011-01-25 03:36:36

标签: haskell

一旦使用直接样式,一旦使用foldr和一次使用列表推导来编写concatMap的功能。

以下函数我是由foldr编写的,但它有一些问题。**

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

2 个答案:

答案 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

opz[ a', b', c', d', .. ]的哪些值会使结果看起来像concatMap f [a, b, c, d, ..]的预期结果?