2014-10-31 77 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

相關問題