我刚开始学习Haskell。我开始写一个简单的函数,它取两个值n和x,然后显示两个用它计算出来的整数值。解析错误,同时运行一个简单的Haskell程序
test n x = do
cell1 = round(n*n*x)
cell2 = n*n - cell1
print cell1
print cell2
但它不运行,并不断给我一个解析错误输入'=”错误。发生什么事?
我刚开始学习Haskell。我开始写一个简单的函数,它取两个值n和x,然后显示两个用它计算出来的整数值。解析错误,同时运行一个简单的Haskell程序
test n x = do
cell1 = round(n*n*x)
cell2 = n*n - cell1
print cell1
print cell2
但它不运行,并不断给我一个解析错误输入'=”错误。发生什么事?
你已经遇到了Monads的第一个麻烦。你可能想在这里你是什么do
块
test n x = do
let cell1 = round (n * n * x)
cell2 = n * n - cell1
print cell1
print cell2
内let
声明这里的区别是,你可以不do
块内直接分配,因为所有do
块desugar来调用>>=
和>>
。该let
语句允许你喜欢你可以像
f x =
let y = 2 * x
z = y * y * y
in z + z + y
函数定义里面的功能将desugar的方式会像
test n x =
let cell1 = round (n * n * x)
cell2 = n * n - cell1
in (print cell1 >> print cell2)
凡>>
刚刚链2个单子行动共同定义了本地值。请注意,这并不是真正解决问题的方式,我选择了一种在这种情况下等价的表示,但它不完全是编译器实际生成的表示。
除了多余的括号外,它*完全是官方从[语言报告](https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-470003.14)中排除的。当然,编译器不会停留在这个阶段...... – 2014-10-31 16:35:06
@ØrjanJohansen我刚才认为它可能有点不同,因为'let'绑定可以使用从一元操作中提取的值('do {x < - m;让y = fx; return y}',例如)。 – bheklilr 2014-10-31 16:40:26
好的,那我该如何在命令行调用这个函数呢?像我运行程序文件,然后我只是做:测试2 0.4?因为这不会给我任何结果。 – 2014-10-31 19:53:58
'let cell1 = ...'而不是'cell1 = ...'。 – Zeta 2014-10-31 15:28:28