Haskellを学ぼうとしていますが、モナドの使い方に問題があります。
モジュールをインポートしましたData.Maybe
。
>>=
しかし、演算子の使い方がわかりません。
関数(>>=) :: Monad m => m a -> (a -> m b) -> m b
の定義方法がわかりません(a -> m b)
。
誰かが教育的な例を提供できますか?
多分モナドのかなり一般的な例は除算です。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
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"