2015-04-05 67 views
-1

我剛開始計劃在Haskell,和我碰到下面的定義來了:什麼是Maybe類型?它是如何工作的?

calculate :: Float -> Float -> Maybe Float 
+4

你無法理解的是什麼?你面臨什麼錯誤?我建議你在發佈問題前先嚐試一下。 – Sibi 2015-04-05 11:35:48

+0

它實際上是一個有效的定義嗎? (注:我提到一個修訂,以同一行上的'function calculate'開頭) – zerkms 2015-04-05 11:38:29

+1

http://en.wikibooks.org/wiki/Haskell/Libraries/Maybe – zerkms 2015-04-05 11:40:18

回答

6

Maybe a是定義爲一個普通的數據類型:

data Maybe a = Just a | Nothing 

因而有兩種可能性:或者你定義a類型的值爲Just a(如Just 3)或Nothing,以防查詢沒有答案。

這意味着定義爲定義非全部函數輸出的方法。

例如:假設您想定義sqrt。平方根僅對於正整數定義,從而可以定義sqrt爲:

sqrt x | x >= 0 = Just $ ... 
     | otherwise = Nothing 

...的方式來計算平方根x

有些人將Nothing與在大多數編程語言中找到的「空指針」進行比較。默認情況下,你沒有爲你定義的數據類型實現一個空指針(如果你這樣做,所有這些「空」看起來不同),通過添加Nothing你有一個通用的空指針。

因此可以使用Maybe來表示可能沒有計算輸出。你當然也錯誤的值小於0

sqrt x | x >= 0 = Just $ ... 
     | otherwise = error "The value must be larger or equal to 0" 

但誤差一般不會在類型簽名提到的,也沒有一個編譯器有任何問題,如果你不考慮它們。 Haskell也轉向總計功能:最好儘量至少爲所有可能的輸入返回一個值(例如Nothing)。

如果你以後想使用Maybe a的結果,你比如需要寫:

succMaybe :: Maybe Int -> Maybe Int 
succMaybe (Just x) = Just (x+1) 
succMaybe _ = Nothing 

但是,對於第一種情況寫Just,你莫名其妙地提醒自己,這是可能的Nothing可以發生。

justOrDefault :: a -> Maybe a -> a 
justOrDefault _ (Just x) = x 
justOrDefault d _ = d 

的內置maybe功能(注意是小寫),結合了前兩者的功能:

maybe :: b -> (a -> b) -> Maybe a -> b 
maybe _ f (Just x) = f x 
maybe z _ Nothing = z 

所以你指定你也可以通過引入一個「默認」值去掉Maybeb(默認值)和一個函數(a -> b)。在Maybe aJust x的情況下,將該功能應用於其並返回,如果輸入值爲Nothing,則將使用默認值。

Maybe a一起工作可能很難,因爲您總是需要考慮Nothing的情況,爲了簡化這一點,您可以使用Maybe monad


湯姆Schrijvers也表明Maybe是類型代數後繼功能:你一個額外的價值添加到您的類型(Either是加法和(,)是類型代數相當於乘法)。

相關問題