2011-01-25 132 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, ..]预期的结果?