2017-04-11 7 views
1

(例えばタイプa -> bの)Applicativeで包み、それに適用される値(上記の例ではタイプaのすなわち値)、私はそれを適用することができます。申請者に純粋な値を適用するための事前定義Haskell演算子?私は機能を持っている場合は、次のよう

doSomething :: Applicative f => f (a -> b) -> a -> f b 
doSomething wrappedFn arg = wrappedFn <*> (pure arg) 

私は自分自身にこれをたくさんしていることがわかります。このコードをより簡潔にする標準の定義済み演算子がどこにあるのでしょうか、それとも自分自身を定義する必要がありますか?後者の場合は、従来の名前がありますか?

+1

(http://hayoo.fh-wedel.de/?query =適用+ f +%3D%3E + f +%28a + - %3E + b%29 + - %3E + a + - %3E + f + b) – Alec

+2

'doSomething'はあなたに大変な入力をしません。 '<*>'と 'pure'の呼び出しを' doSomething'の呼び出しで置き換えます。また、重要なことに、引数のいくつかが純粋で、一部がラップされるようにする場合は特に、2+の引数関数に比例しません。私は 'f <*> pure x'と' f <*> x <*> pure y'と書くだけで読みやすくする方が良いと思います。 – amalloy

+0

@Alec - そうです、それは私が探しているようです。なぜホogleはそれを見つけられなかったのだろう... – Jules

答えて

6

ありますかこのコードをより簡潔にする標準の定義済み演算子をどこか...?

...または私は1つを自分で定義する必要がありますか?

はい(外部パッケージをインポートする場合を除く)。

後者の場合、従来の名前はありますか?

レンズには(??)、一部にはother namesがあります。 ((->) a

flip ::    (a -> b -> c) -> b -> a -> c 
(??) :: Functor f => f (b -> c) -> b -> f c 

代替f、あなたは(??)からflipを得る:レンズによると、それは理にかなってflipの一般バリアント、です。したがって、一般化フリップと呼ぶことができます。

ところで、あなたはApplicativeは必要ありません。 Functorは十分です:

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

いくつかの例:[?この]

ghci> gFlip [(+ 1),(* 2)] 2 
[3, 4] 
ghci> gFlip (++) "world" "hello" 
"helloworld" 
3

実際にこの演算子の適度によく知られたバージョン、すなわち、(??) from lensあり:

(??) :: Functor f => f (a -> b) -> a -> f b 

Functor制約に注意してください。それは\f x -> ($ x) <$> fと定義することができるので、Applicativeは必要でないことが分かります。

(??)のための標準的なユースケースは、機能のファンクタであり、中置flipとして:一般的なケースでは

GHCi> execState ?? [] $ modify (1:) 
[1] 

、それは正確に何をしたいん:

個人的に
GHCi> [negate] ?? 3 
[-3] 

(、私はまだ[negate] <*> pure 3を読むことができますが、YMMVです。)

+2

個人的に、私は '[negate 3]'または '[-3]'がより読みやすくなっています:D。 – Zeta

+1

@Zeta私はおそらく、わかりやすい例の私の在庫を更新する必要があります:D – duplode

関連する問題