この機能を使用することをお勧めし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