web-dev-qa-db-ja.com

Haskellでたぶんタイプを使う

HaskellでMaybe型を利用しようとしています。 Maybeを返すキー、値のタプルのルックアップがあります。 Maybeでラップされたデータにアクセスするにはどうすればよいですか?たとえば、Maybeに含まれる整数を別の整数に追加したいとします。

35
dpsthree

別の方法として、パターンマッチングを行うこともできます。

case maybeValue of
  Just value -> ...
  Nothing    -> ...
39
Martijn

Data.Maybe.fromMaybeを使用できます。これは、Maybe aと、Nothingの場合に使用する値を受け取ります。安全でないData.Maybe.fromJustを使用できますが、値がNothingの場合にクラッシュします。 Maybeに保管しておくとよいでしょう。 Maybeに整数を追加したい場合は、次のようにすることができます

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

それは同じです

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

f 3Just 7になります。 (この方法で、追加の計算を続けてチェーンできます。)

20
arsenm

「たぶん」の例:

> maybe 0 (+ 42) Nothing
0
> maybe 0 (+ 42) (Just 12)
54
8

補足として:MaybeMonadなので、do- notationを使用して計算を構築できます...

sumOfThree :: Maybe Int
sumOfThree = do
  a <- someMaybeNumber
  b <- someMaybeNumber
  c <- someMaybeNumber
  let k = 42 -- Just for fun
  return (a + b + c + k)
8
Dario

すみません、ググったほうがいいです。

fromMaybe関数の使用がまさに私が必要とするものです。 fromMaybeは、何もない場合はMaybeの値を返します。それ以外の場合は、fromMaybeに提供されるデフォルト値を返します。

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

4
dpsthree

多くの人は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
4
vikingsteve