簡體   English   中英

什么是Maybe類型,它是如何工作的?

[英]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 aJust x ,則將函數應用於它並返回,如果輸入值為Nothing ,則將使用默認值。

使用Maybe a可能很難,因為你總是需要考慮Nothing案例,為了簡化這個,你可以使用Maybe monad


Tom Schrijvers還表明, Maybe是類型代數中的后繼函數:你為你的類型添加一個額外的值( Either是加法而且(,)是乘法的類型 - 代數等價物)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM