2010-09-04 39 views
31

我正在嘗試在Haskell中使用Maybe類型。我查找了返回Maybe的關鍵值數組。如何訪問由Maybe包裝的數據?例如,我想將Maybe包含的整數與另一個整數相加。在Haskell中使用Maybe類型

+1

這是一個重複:http://stackoverflow.com/questions/3375483/operating-on-a-return-from-a-maybe-that -contains-just/3375712#3375712 – 2010-09-04 19:16:49

回答

31

另外,您可以模式匹配:用do -notation由於MaybeMonad,你可以建立計算:

case maybeValue of 
    Just value -> ... 
    Nothing -> ... 
+1

這更像我想要做的,而不是我找到的答案。謝謝 – dpsthree 2010-09-07 05:22:59

+1

我應該在類型聲明中說什麼? – qed 2014-12-24 21:03:54

3

對不起,我應該GOOGLE更好。

使用fromMaybe函數正是我所需要的。 fromMaybe將返回Maybe中的值,如果它不是什麼也不返回,否則它將返回提供給fromMaybe的默認值。

http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Maybe.html

+6

是的,但要確保這是你想要的行爲,因爲如果你打算,例如,使用一個Maybe Int,然後每當它沒有時你返回零,那麼你應該有從一開始就使用了一個普通的舊Int。也許是應該幫助編碼沒有結果或價值,而不是真的應該被解決。我個人儘量避開fromMaybe函數。 – 2010-09-11 03:44:25

18

你可以使用Data.Maybe.fromMaybe,這需要一個Maybe a和值,如果它是Nothing使用。您可以使用不安全的Data.Maybe.fromJust,如果值爲Nothing,則會發生崩潰。你可能想保留在Maybe。如果你想在一個Maybe添加一個整數,你可以不喜歡

f x = (+x) <$> Just 4 

這是一樣的

f x = fmap (+x) (Just 4) 

f 3然後將Just 7。 (您可以繼續鏈附加的計算以這種方式)。

+0

'f 3'將會是'只有7',而不是'7'。 – Yitz 2010-09-04 23:55:28

+0

據此編輯。 – jrockway 2010-09-05 00:07:37

8

正如一個側面說明...

爲 「可能」
sumOfThree :: Maybe Int 
sumOfThree = do 
    a <- someMaybeNumber 
    b <- someMaybeNumber 
    c <- someMaybeNumber 
    let k = 42 -- Just for fun 
    return (a + b + c + k) 
4

很多人都反對使用fromJust,但是如果你知道的,當查找失敗會發生什麼它可以方便的(錯誤!)

首先,你需要這樣的:

import Data.Maybe 

然後從元組列表您查找看起來像這樣

Data.Maybe.fromJust $ lookup key listOfTuples 

例如,成功的查詢:

Data.Maybe.fromJust $ lookup "a" [("a",1),("b",2),("c",3)] 
1 

而且可怕的失敗看起來是這樣的:

Data.Maybe.fromJust $ lookup "z" [("a",1),("b",2),("c",3)] 
*** Exception: Maybe.fromJust: Nothing