use*_*628 2 haskell lazy-evaluation
根据我的理解,延迟评估是在将参数传递给函数之前不对其进行求值,但仅在它们的值实际使用时才进行求值.
但是在一个haskell教程中,我看到了一个例子.
xs = [1,2,3,4,5,6,7,8]
doubleMe(doubleMe(doubleMe(xs)))
Run Code Online (Sandbox Code Playgroud)
作者说,命令式语言可能会通过列表一次并复制然后返回.然后它将再次通过列表两次并返回结果.
但是在一种懒惰的语言中,它首先会计算出来
doubleMe(doubleMe(doubleMe(1)))
Run Code Online (Sandbox Code Playgroud)
这将回馈一个doubleMe(1),即2.然后4,最后8.
因此,只有当你确实需要它时,它才能通过列表.
这让我感到困惑.懒惰语言为什么不把整个列表作为一个整体,但拆分呢?我的意思是我们可以在使用它之前忽略列表或表达式.但是我们需要在使用它时评估整个事情,不是吗?
像这样的列表[1,2,3,4,5,6,7,8]只是语法糖:1:2:3:4:5:6:7:8:[].
在这种情况下,列表中的所有值都是数字常量,但我们可以定义另一个较小的列表,如下所示:
1:1+1:[]
Run Code Online (Sandbox Code Playgroud)
所有Haskell的列表是链表,这意味着他们有一个头部和尾部.在上面的例子中,头是1,而尾是1+1:[].
如果您只想要列表的头部,则没有理由评估列表的其余部分:
(h:_) = 1:1+1:[]
Run Code Online (Sandbox Code Playgroud)
在这里,h指的是1.1+1:[]如果h你需要,没有理由评估列表的其余部分().
这就是懒惰评估列表的方式.在需要值之前,它1+1仍然是一个thunk(一个未评估的表达式).