我刚开始学习Haskell。我开始编写一个简单的函数,它接受两个值n和x,然后显示两个用它计算的整数值。
test n x = do
cell1 = round(n*n*x)
cell2 = n*n - cell1
print cell1
print cell2
但是它没有运行并且在输入`='错误时不断给出 Parse错误。发生了什么事?
答案 0 :(得分:4)
你遇到Monads的第一个麻烦。您可能需要的是let
块
do
语句
test n x = do
let cell1 = round (n * n * x)
cell2 = n * n - cell1
print cell1
print cell2
此处的不同之处在于,您无法直接在do
块内部进行分配,因为所有do
块都会阻止对>>=
和>>
的调用。 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)
>>
只将两个monadic动作链接在一起。请注意,这并不是它如何去除,我选择了一个在这种情况下等效的表示,但它并不完全是编译器实际生成的。