我搜索过但无法找到函数scanr
和scanl
的简单定义,只能解释它们显示函数foldr
和foldl
的中间计算)。
我根据scanl
属性foldl
为foldl 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'
递归时执行此操作。
答案 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