-2

関数を実装する必要がありますmaybemap

それは(関数マップに類似した)関数を持っています

f :: a -> b

リストタイプに適用し、リストMaybe aを提供する必要がありますMaybe b

maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]

関数をどのように定義しmaybemapますか?

4

2 に答える 2

5

最も簡単な解決策は、前述のとおり、

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 -> bfmapf a -> f bfmap

fmap2 = fmap fmap fmap
于 2013-11-04T11:31:25.113 に答える