一旦使用直接样式,一次使用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, ..]
预期的结果?