2013-07-18 58 views
3
maybe :: b -> (a -> b) -> Maybe a -> b -- Defined in `Data.Maybe' 

從這個定義的也許,B可以是任何類型,應該是相同的類型的函數的返回值(A-> B) 但是,當我在Winghci嘗試這樣做:Haskell中也許起作用困惑

maybe (error "no") (head) (Just "hi") 
'h' 
maybe (error "no") (return) (Just "hi") 
"hi" 

這兩部作品,但顯然返回和頭部有不同的類型,但兩者的工作(錯誤「無」) 當我鍵入:

:t error "no" 

我得到

error "no" :: a 

這是否意味着錯誤「否」可以是任何類型? 這是爲什麼?

+5

是, '錯誤「...」',像'undefined',可以有任何類型。直覺是,無論評估什麼,它永遠都不會有機會看到它(因爲整個計算會中止),所以它從來沒有機會成爲錯誤的類型。 – luqui

+1

是的,'錯誤「否」'可以是任何類型。這是'錯誤'的一點。 '錯誤::字符串 - > a',一種不可恢復的失敗。你是如何在第一時間使用'error'的? – shachaf

+0

@shachaf你的意思是這不是典型的人們如何使用可能或錯誤?我在Haskell教程的其他地方看過這段代碼 – osager

回答

4
> :t error 
error :: [Char] -> a 

error需要String,所以你可以告訴是什麼問題的用戶。

因爲它返回a,這是因爲錯誤可能發生在程序中的任何地方,所以如果它是「任何類型」,您可以在任何需要的地方設置錯誤。

例如:

功能head具有簽名

head :: [a] -> a 

它顯然返回一個列表的頭部。

但是如果我們給它一個空的列表會發生什麼。

Prelude> head ([] :: [Int]) 
*** Exception: Prelude.head: empty list 

head應該返回一個類型Int因爲我們迫使它在空列表

Prelude> :t head ([] :: [Int]) 
head ([] :: [Int]) :: Int 

所以我們能返回是類型Int(針對這種特殊情況下),並顯示用戶認爲出了些問題?

error "empty list" 

,但我們需要的是Int,這樣的錯誤,爲a,可以是任何東西,如Int

head的源代碼是這樣的:

head :: [a] -> a 
head (x:_) = x 
head [] = error "empty list"