1

たとえば、関数、、およびがあったdouble(x) = 2 * xsquare(x) = x ^ 2sum(x,y) = x + yます。composeのような機能は何compose(compose(sum, square), double) = x^2 + 2*xですか?あらゆるアリティの関数に使用できる関数を求めていることに注意してください。たとえば、、、を使用f(x,y,z)してを作成できます。g(x)h(x)i(x)f(g(x), h(x), i(x))

4

1 に答える 1

4

これは一般的なHaskellのイディオムであり、適用可能なファンクターです。

composed = f <$> g1 <*> g2 <*> ... <*> gn

(より良い紹介はここにあります)。

これは、自動部分適用のために非常にきれいに見え、次のように機能します。

(<*>) f g x = f x (g x)
(<$>) f g x = f (g x) -- same as (.)

例えば、

f <$> g <*> h <*> i ==>
(\x -> f (g x)) <*> h <*> i ==>
(\y -> (\x -> f (g x)) y (h y)) <*> i ==>
(\y -> f (g y) (h y)) <*> i ==>
(\z -> (\y -> f (g y) (h y)) z (i z)) ==>
(\z -> f (g z) (h z) (i z)).

ただし、適用可能なファンクターはより一般的です。それらは「アルゴリズム」ではなく、概念です。たとえば、ツリーでも同じことを行うことができます(適切に定義されている場合)。

(+) <$> (Node (Leaf 1) (Leaf 2)) <*> (Node (Leaf 3) (Leaf 4)) ==>
Node (Leaf 4) (Leaf 6)

しかし、部分適用が簡単ではないため、Applicativeが他のほとんどの言語で実際に使用できるとは思えません。

于 2012-11-18T17:15:57.383 に答える