6

私が達成したいことは次のとおりです。

apply :: a -> [a -> b] -> [b]

これはマップの逆のようなものです:

map :: (a -> b) -> [a] -> [b]

Hoogle を試してみましたが、役に立ちませんでした。Haskellでこれを行うクリーンな方法を提案できる人はいますか?

4

2 に答える 2

15
apply :: a -> [a -> b] -> [b]
apply a = map ($ a)

これは卑劣な言い方です

apply a = map (\f -> f a)

これはより明確かもしれません。

于 2013-07-25T21:23:28.643 に答える
3

\a -> map ($ a)間違いなく問題ありませんが、おそらくもう少し優れたApplicativeアプローチがあります。

<**> :: Applicative f => f a -> f (a -> b) -> f b

インスタンスを持っています<*> :: [a] -> [a->b] -> [b]。あなたが望むものによく似ています!値をシングルトンリストに入れるだけaでよく、専用の関数もApplicative:にありpureます。

apply :: Applicative f => a -> f (a -> b) -> f b
apply = (<**>) . pure

実際には、可能な限り最も一般的な署名を持っているように見えるa -> [a->b] -> [b]ため、この最上位バインディングの署名を制限したいと思いますが、そうではありません。Applicative

apply :: Functor f => a -> f (a -> b) -> f b
apply a = fmap ($ a)

本当に、私の解決策は、何らかのパイプラインにいる場合におそらく最適です。定義するのではなく、コードで直接apply使用するのが最善だと思います。(<**>) . pure

于 2013-07-25T22:22:54.423 に答える