2014-10-31 84 views
1

我刚开始学习Haskell。我开始写一个简单的函数,它取两个值n和x,然后显示两个用它计算出来的整数值。解析错误,同时运行一个简单的Haskell程序

test n x = do 
    cell1 = round(n*n*x) 
    cell2 = n*n - cell1 
    print cell1 
    print cell2 

但它不运行,并不断给我一个解析错误输入'=”错误。发生什么事?

+4

'let cell1 = ...'而不是'cell1 = ...'。 – Zeta 2014-10-31 15:28:28

回答

4

你已经遇到了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个单子行动共同定义了本地值。请注意,这并不是真正解决问题的方式,我选择了一种在这种情况下等价的表示,但它不完全是编译器实际生成的表示。

+0

除了多余的括号外,它*完全是官方从[语言报告](https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-470003.14)中排除的。当然,编译器不会停留在这个阶段...... – 2014-10-31 16:35:06

+0

@ØrjanJohansen我刚才认为它可能有点不同,因为'let'绑定可以使用从一元操作中提取的值('do {x < - m;让y = fx; return y}',例如)。 – bheklilr 2014-10-31 16:40:26

+0

好的,那我该如何在命令行调用这个函数呢?像我运行程序文件,然后我只是做:测试2 0.4?因为这不会给我任何结果。 – 2014-10-31 19:53:58