[英]What is the Maybe type and how does it work?
我剛剛開始在Haskell中編程,我遇到了以下定義:
calculate :: Float -> Float -> Maybe Float
Maybe a
是一種普通的數據類型,定義如下:
data Maybe a = Just a | Nothing
因此有兩種可能性:或者您將類型a
的值定義為Just a
(如Just 3
),或者在查詢沒有答案的情況下將Nothing
定義為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
可以發生。 您還可以通過引入“默認”值來擺脫Maybe
:
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
所以你指定一個b
(默認值)和一個函數( a -> b
)。 如果Maybe a
是Just x
,則將函數應用於它並返回,如果輸入值為Nothing
,則將使用默認值。
使用Maybe a
可能很難,因為你總是需要考慮Nothing
案例,為了簡化這個,你可以使用Maybe monad 。
Tom Schrijvers還表明, Maybe
是類型代數中的后繼函數:你為你的類型添加一個額外的值( Either
是加法而且(,)
是乘法的類型 - 代數等價物)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.