2013-04-24 50 views
0

有人能告訴我爲什麼下面的代碼不起作用嗎?Haskell Return與預期不符

test :: String 
test = 
    do 
     return ("Hi") 

我一直在努力使do語句工作一段時間,而且我一直在追究這個問題。我知道這不是你應該保持不變的方式,但是這樣整齊地總結了我所得到的問題。

我得到以下錯誤:

Test.hs:5:21: 
Couldn't match expected type `Char' with actual type `[Char]' 
In the first argument of `return', namely `("Hi")' 
In a stmt of a 'do' block: return ("Hi") 
In the expression: do { return ("2") } 

更新:我明白了。在我努力將問題抽象到導致問題的部分時,我創建了另一個問題。儘管如此,無論如何,這無意中導致我解決了這個問題。

回答

3

GHCI給出如下:

:t do {return ("Hi")} 
do {return ("Hi")} :: Monad m => m [Char] 

這意味着do {return ("Hi")}String型亦稱[Char]的不是,而是Monad m => m [Char]

一個列表是一個單子,所以它在類型上處理Monad m但留下[Char];但是在清單從String中拿走後,剩下的只是Char,與[Char]不匹配,所以出現錯誤。

+0

謝謝。那樣做了。我很感激你給了我一個解決進一步問題的方法。 – 2013-04-24 20:13:34

+0

不客氣,我想你在做比代碼示例更復雜的東西,所以我在我的答案中給出了類型。 GHCi可以非常方便,所以我建議你在困惑時使用它:) – 2013-04-24 20:15:39

3

return Haskell不是關鍵字 - 它只是一個正常的函數,它恰好有這個名字。在功能方面,表達自動返回:

test :: String 
test = "Hi" 

這是真實的,即使你的函數取一個參數:

double x = 2 * x 

看來你是真正的新哈斯克爾。你應該閱讀一本漂亮的書,如"Learn You a Haskell"來熟悉它,因爲它像字面上沒有像你曾經使用過的任何其他語言,所以你現有的經驗不會很有幫助。