この機能を使用することをお勧めしmaybeます。この一般的な経験則 (あなたのためだけでなく、それを読んでいる初心者のための) のために、あなたがこの質問をするのは正しかった: のような型を持つ関数Maybe Foo -> BarやMaybe Foo -> Maybe Bar、直接定義されている関数は、Haskellではコードのにおいがする。Maybe Foo引数として取る関数を書きたいと思うことはほとんどありません。だけを取る関数が必要でFoo、高階関数を使用して に適応させMaybe Fooます。
関数 があるとしますf' :: Maybe Foo -> Maybe Bar。これは通常、次のいずれかにリファクタリングできます。
f :: Foo -> Barそしてfmap f :: Maybe Foo -> Maybe Bar;
f :: Foo -> Maybe Barと(>>=f) :: Maybe Foo -> Maybe Bar
これは のFunctorインスタンスであるため、最初のケースが機能しMaybeます。
instance Functor Maybe where
fmap f Nothing = Nothing
fmap f (Just x) = Just (f x)
-- or this:
-- fmap f = maybe Nothing (Just . f)
2 番目のケースは、次のMonadインスタンスであるため機能しMaybeます。
instance Monad Maybe where
return = Just
Nothing >>= f = Nothing
(Just x) >>= f = f x
-- or this:
-- mx >>= f = maybe Nothing f mx