私が達成したいことは次のとおりです。
apply :: a -> [a -> b] -> [b]
これはマップの逆のようなものです:
map :: (a -> b) -> [a] -> [b]
Hoogle を試してみましたが、役に立ちませんでした。Haskellでこれを行うクリーンな方法を提案できる人はいますか?
私が達成したいことは次のとおりです。
apply :: a -> [a -> b] -> [b]
これはマップの逆のようなものです:
map :: (a -> b) -> [a] -> [b]
Hoogle を試してみましたが、役に立ちませんでした。Haskellでこれを行うクリーンな方法を提案できる人はいますか?
apply :: a -> [a -> b] -> [b]
apply a = map ($ a)
これは卑劣な言い方です
apply a = map (\f -> f a)
これはより明確かもしれません。
\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