2

今、Haskell ライブラリには、私がやりたいことをする何かがあるかもしれません。私は初心者なので、よく知っているツールを使用してカスタムマップ関数を作成しようとしています。型シグネチャは

myMap :: (Monad m) => (a -> b) -> [m a] -> [m b]

whereは、の各 Monad の各値にmyMap f as適用した後にリストを返します。fas

私の最初の試みは

myMap f = map (\x x >>= f)

ただし、これには型シグネチャがあります

myMap :: (Monad m) => (a -> m b) -> [m a] -> [m b]

これは私が必要としているものに非常に近く、私は叫ぶことができます. ここから先の進め方のヒントが必要です。ライブラリ関数と同じくらい簡単であることを本当に願っていますが、代わりにこれを行う独自の短い関数を喜んで作成します。

関連する質問:

2 つの入力リストに対する関数のマッピング

4

2 に答える 2

5

(a -> b)関数をに変えることができれば、それ自体m a -> m bを使用できますmap。それで、これを行うには何が必要ですか?Hoogle は、この種の作業に非常に適しています。を検索すると(a -> b) -> (m a -> m b)、次の結果が得られます。

http://www.haskell.org/hoogle/?hoogle=%28a+-%3E+b%29+-%3E+%28m+a+-%3E+m+b%29

上部近くにfmap(を使用するFunctor) とliftM(を使用するMonad) があります。どちらでもいいのですが、モナドを使っているので で行きましょうliftM。したがって:

myMap :: Monad m => (a -> b) -> [m a] -> [m b]
myMap f = map (liftM f)
于 2013-10-07T02:43:55.027 に答える