我不知道想要它的问题。我只是按照书中所说的那样。 [学习Haskell for Great Good]这本书的描述如下:
假设您有一个不可变的数字列表xs = [1,2,3,4,5,6,7,8]和一个函数doubleMe,它将每个元素乘以2然后返回一个新列表。如果我们想用命令式语言将我们的列表乘以8并且确实如此 doubleMe(doubleMe(doubleMe(xs))),它可能会通过列表一次并复制然后返回。
答案 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]
的第一个项目,并且每次多次计算两次,直到我们获得八个。