在Haskell中编写concatMap函数

在Haskell中编写concatMap函数,haskell,Haskell,一次使用直接样式,一次使用foldr,一次使用列表理解来编写concatMap函数 下面的函数是我写的foldr,但它有一些问题** concatMap' :: (a -> [b]) -> [a] ->[b] concatMap' f []=[] concatMap' f (x:xs)==foldr (\x acc->acc : f x) [] xs 由于您应该使用foldr,因此不会编写concatMap'的显式递归定义。因此,您只需要一个定义。要使用

一次使用直接样式,一次使用foldr,一次使用列表理解来编写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规范中,或者您可以搜索它)

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

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