4

Haskellを学ぼうとしていますが、モナドの使い方に問題があります。

モジュールをインポートしましたData.Maybe

>>=しかし、演算子の使い方がわかりません。

関数(>>=) :: Monad m => m a -> (a -> m b) -> m bの定義方法がわかりません(a -> m b)

誰かが教育的な例を提供できますか?

4

2 に答える 2

14

多分モナドのかなり一般的な例は除算です。Justある意味で、多分モナドは結果( )または失敗( )のいずれかを与える計算を表し、Nothing除算は正確にこれです。0で除算しない限り機能します。この場合、それは失敗です。

コードは常に役立ちます:

divide :: (Fractional a) => a -> a -> Maybe a
divide a 0 = Nothing
divide a b = Just $ a / b

この関数の使用例:

> divide 1 2
Just 0.5
> divide 20 3
Just 6.666666666666667
> divide 1 0 -- Oops
Nothing

divide多分モナドなので、この関数を使用してエラーを自動的に伝播する計算を行うことができます。たとえば、次の計算は1/x + 1安全に行われます

recipPlusOne :: (Fractional a) => a -> Maybe a
recipPlusOne x = divide 1 x >>= return . (+1)

-- equivalently,
recipPlusOne' x = fmap (+1) $ divide 1 x

return . (+1)(関数a -> m bは、数値を取り、1()を追加(+1)し、それを多分モナド()でラップするので、どのようになっているのかに注意してくださいreturn。)

そして、エラーは次のように伝播します。

> recipPlusOne 1
Just 2.0
> recipPlusOne 0.1
Just 11.0
> recipPlusOne 0 -- Oops, divide by 0
Nothing
于 2012-06-04T13:29:24.970 に答える
8

Maybeモナドバインド関数の場合()>>=は次のようになります。

(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b

Maybe aそれでは、いくつかの値を定義しましょう。

> let a = Just 1
a :: Maybe Integer

そして:: a -> Maybe b機能:

> let f = \x -> Just (x+1)
f :: Integer -> Maybe Integer

これで、中置演算子のようにバインドを使用できます。

> a >>= f
Just 2
it :: Maybe Integer

実際のa -> Maybe b機能の別の例は次のとおりです。

let h :: Integer -> Maybe String; h = return . show . (+1)
h :: Integer -> Maybe String

したがってh、整数をインクリメントし、それを文字列に変換して、関数を使用してMaybe値を作成しreturnます。

> a >>= h
Just "2"
于 2012-06-04T13:06:00.447 に答える