有人可以向我解释为什么这等于5?
let x = x+3 in fst (snd (x+1,(5,x-2)))
Run Code Online (Sandbox Code Playgroud)
让我们暂时忽略这let x = x + 3 in部分,并关注以下内容in:
fst (snd (x + 1, (5, x - 2)))
Run Code Online (Sandbox Code Playgroud)
随着的定义fst和snd福祉
fst (a, b) = a
snd (a, b) = b
Run Code Online (Sandbox Code Playgroud)
所以首先减少括号中的内容
snd (x + 1, (5, x - 2)) ==> (5, x - 2)
Run Code Online (Sandbox Code Playgroud)
现在这传递给fst:
fst (5, x - 2) ==> 5
Run Code Online (Sandbox Code Playgroud)
所以最终价值x实际上并不重要.
这可能发生在Haskell中,因为有些东西叫做懒惰评估.从本质上讲,编译器在需要之前不会解析值.随着定义
x = x + 3
Run Code Online (Sandbox Code Playgroud)
如果你试图打印,x你会得到一个无限循环,当你内存不足试图评估它时,可能会出现错误.由于x从未实际打印出值,编译器可以自由解析其值.在REPL中评估该表达式时打印到控制台的值为5,它与值的依赖性无关x,因此x可以安全地忽略.
另一个懒惰编程的例子就是表达式
> let ones = 1:ones in take 5 ones
[1,1,1,1,1]
Run Code Online (Sandbox Code Playgroud)
该定义let ones = 1:ones定义了1的无限列表,但由于我们只抓取其中的5个take 5 ones,因此该表达式能够解析.
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |