HaskellでMaybe型を利用しようとしています。 Maybeを返すキー、値のタプルのルックアップがあります。 Maybeでラップされたデータにアクセスするにはどうすればよいですか?たとえば、Maybeに含まれる整数を別の整数に追加したいとします。
別の方法として、パターンマッチングを行うこともできます。
case maybeValue of
Just value -> ...
Nothing -> ...
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
になります。 (この方法で、追加の計算を続けてチェーンできます。)
「たぶん」の例:
> maybe 0 (+ 42) Nothing
0
> maybe 0 (+ 42) (Just 12)
54
補足として:Maybe
はMonad
なので、do
- notationを使用して計算を構築できます...
sumOfThree :: Maybe Int
sumOfThree = do
a <- someMaybeNumber
b <- someMaybeNumber
c <- someMaybeNumber
let k = 42 -- Just for fun
return (a + b + c + k)
すみません、ググったほうがいいです。
fromMaybe関数の使用がまさに私が必要とするものです。 fromMaybeは、何もない場合はMaybeの値を返します。それ以外の場合は、fromMaybeに提供されるデフォルト値を返します。
http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Maybe.html
多くの人は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