我剛開始學習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