scanr3:为什么step(二元运算符)接受[0]作为参数?

时间:2017-12-24 02:34:50

标签: haskell

Lists_III Solutions

待办事项:使用foldr编写自己的扫描仪定义。

在完成我的职能之后,我研究了本书的解决方案并看到了这一步骤'调用步骤从步骤'中获取其x参数用两个列表参数调用:[0]和xs。然后步骤'使用列表x和数字(头部xs)调用步骤。奇怪的是,如果你用一个数字替换[零],比如删除方括号,就像普通零一样,程序编译但不运行。它实际上想要一个清单。那是为什么?

map_dfr

1 个答案:

答案 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替换,并在

where step' x xs = (step x (head xs)):xs

其中xs = zero等同于

where step' x zero = (step x (head xs)):zero

因此,zero应该是一个列表,因为它应该位于:的右侧。