2010-05-25 80 views
18

我只是在學習Haskell。我認爲這將產生一個階乘函數...haskell中的無限循環? (新手)

(ghci的範圍內)

Prelude> let ft 0 = 1 
Prelude> let ft n = n * ft (n - 1) 
Prelude> ft 5 

(無限期掛起,直到^ C)。

有人能指出我正確的方向嗎?

謝謝!

回答

29

這兩個單獨的let語句是相互獨立解釋的。首先定義一個函數ft 0 = 1,然後定義一個新函數ft n = n * ft (n - 1),覆蓋第一個定義。

要定義一個函數與兩種情況下,你必須將兩個案件放入一個單一的let語句。要在GHCI一行做到這一點提示您可以通過;兩種情況分開:

Prelude> let ft 0 = 1; ft n = n * ft (n - 1) 
Prelude> ft 5 
120 
+8

換句話說,你寫的是(幾乎)正確哈斯克爾;問題在於GHCI接受的是不同於你放在單獨源文件中的語法。如果你把這兩行,但沒有的話'let'(這是「幾乎」),文件中的Factorial.hs,然後在輸入GHCI: ':加載Factorial' 然後 '英尺5' 你會得到120. 不知道你是否遇到過「記號」(例如I/O),但GHCI提示符允許的語法與允許的內容相同阻止。 – 2010-05-25 01:30:14