関数を実装する必要がありますmaybemap
それは(関数マップに類似した)関数を持っています
f :: a -> b
リストタイプに適用し、リストMaybe a
を提供する必要がありますMaybe b
maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
関数をどのように定義しmaybemap
ますか?
関数を実装する必要がありますmaybemap
それは(関数マップに類似した)関数を持っています
f :: a -> b
リストタイプに適用し、リストMaybe a
を提供する必要がありますMaybe b
maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
関数をどのように定義しmaybemap
ますか?
最も簡単な解決策は、前述のとおり、
maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
maybemap = map . fmap
しかし、一般的には、より一般的な機能です:
maybemap :: Functor f => (a -> b) -> [f a] -> [f b]
ご覧のとおり、リストもファンクターなので、書き換えることができます
fmap2 :: (Functor f, Functor g) => (a -> b) -> g (f a) -> g (f b)
fmap2 = fmap . fmap
そしてテスト:
> fmap2 (++"!") [Nothing,Just"u"]
[Nothing,Just "u!"]
更新しました
で最も面白いのはfmap2
、関数(.)
のファンクターでもあり、同じシグネチャを持つ関数です: . そして、私たちの関数は s のみで構成されます:a -> b
fmap
f a -> f b
fmap
fmap2 = fmap fmap fmap