Haskell中scanl和scanr的递归定义

时间:2018-05-07 00:37:25

标签: haskell higher-order-functions fold

我搜索过但无法找到函数scanrscanl的简单定义,只能解释它们显示函数foldrfoldl的中间计算)。

我根据scanl属性foldlfoldl f y (x:xs) = foldl f (f y x) xs编写了一个递归定义:

scanl' :: (b -> a -> b) -> b -> [a] -> [b]
scanl' f x [] = [x]
scanl' f x (y:ys) = x : scanl' f (f x y) ys

这似乎有效。但是,当我尝试将此类比应用于foldr属性foldr f y (x:xs) = f x (foldr f y xs)时,会出现类型错误:

scanr' :: (a -> b -> b) -> b -> [a] -> [b]
scanr' _ x [] = [x]
scanr' f x (y:ys) = y : f x (scanr' f x ys)

此操作失败,因为f的第二个输入需要是b而不是[b]。但是,我不确定如何在scanr'递归时执行此操作。

1 个答案:

答案 0 :(得分:2)

计算

result = scanr' f x (y:ys)

你必须有计算

partialResult = scanr' f x ys

之后你得到

result = (y `f` head partialResult) : partialResult

完整的实施是

scanr' _ x [] = [x]
scanr' f x (y:ys) = (y `f` head partialResult) : partialResult
    where partialResult = scanr' f x ys