待办事项:使用foldr编写自己的扫描仪定义。
在完成我的职能之后,我研究了本书的解决方案并看到了这一步骤'调用步骤从步骤'中获取其x参数用两个列表参数调用:[0]和xs。然后步骤'使用列表x和数字(头部xs)调用步骤。奇怪的是,如果你用一个数字替换[零],比如删除方括号,就像普通零一样,程序编译但不运行。它实际上想要一个清单。那是为什么?
map_dfr
答案 0 :(得分:1)
为什么?据我理解你的问题,表达式类型(用你的话说,它编译)因为它推断出zero
是一个列表(为什么?[1])。
-- this expression types!
scanr3 step zero xs = foldr step' zero xs
where step' x xs = (step x (head xs)):xs
回想一下,zero
现在应该是一个列表:
Prelude> scanr3 (+) [0] [1,2,3]
[6,5,3,0]
但不能像您预期的那样Int
:
Prelude> scanr3 (+) 0 [1,2,3]
<interactive>:18:1: error:
• Non type-variable argument in the constraint: Num [a]
(Use FlexibleContexts to permit this)
• When checking the inferred type
it :: forall a. (Num [a], Num a) => [a]
[1]:因为,当定义达到foldr
的基本情况时,即foldr step' zero []
,它将被zero
替换,并在}中替换此表达式。 p>
where step' x xs = (step x (head xs)):xs
其中xs = zero
等同于
where step' x zero = (step x (head xs)):zero
因此,zero
应该是一个列表,因为它应该位于:
的右侧。