变量不在范围内:doubleMe :: [Integer] - > t(哈斯克尔)

时间:2018-04-21 15:56:40

标签: haskell

Picture of the problem

我不知道想要它的问题。我只是按照书中所说的那样。 [学习Haskell for Great Good]这本书的描述如下:

  

假设您有一个不可变的数字列表xs = [1,2,3,4,5,6,7,8]和一个函数doubleMe,它将每个元素乘以2然后返回一个新列表。如果我们想用命令式语言将我们的列表乘以8并且确实如此   doubleMe(doubleMe(doubleMe(xs))),它可能会通过列表一次并复制然后返回。

2 个答案:

答案 0 :(得分:4)

doubleMe不是内置函数。本书假定您已使用

之类的内容对其进行了定义
doubleMe = fmap (* 2)

(这就是“说你有......”的意思。)

您还没有定义该功能,因此解释器告诉您doubleMe未定义。

答案 1 :(得分:2)

这本书指出:

  

说你有......

这是假设意义上的:列表error: Undefined method find_or_create_by 和函数xs都不像Haskell中的内置存在,本书旨在证明如果我们有这样的功能,那么Haskell解释器如何构建新列表(以惰性方式)和命令式等效项之间的重要区别(构造三个完整列表)。

我们可以用以下方式定义:

doubleMe

因此,我们将Prelude> doubleMe = map (2*) Prelude> xs = [1,2,3,4,5,6,7,8] Prelude> doubleMe xs [2,4,6,8,10,12,14,16] 定义为doubleMe,以便我们将所有元素相乘。可能这本书解释说,在Haskell中,如果我们评估这个,由于懒惰,我们永远不会完全构建中间列表,以防我们调用:

map (2*)

实际上,如果我们想要获得第一个列表,我们将评估 Prelude> doubleMe (doubleMe (doubleMe xs)) [8,16,24,32,40,48,56,64] 的第一个项目,并且每次多次计算两次,直到我们获得八个。