9

((.).(.))という表現の意味を教えてください。私の知る限り、(.) の型は (b -> c) -> (a -> b) -> a -> c です。

4

2 に答える 2

24

(.) . (.)合成演算子とそれ自体の合成です。

見ると

((.) . (.)) f g x

いくつかのステップで評価できます。最初に括弧を付けます。

((((.) . (.)) f) g) x

次に、次を使用して適用します(foo . bar) arg = foo (bar arg)

~> (((.) ((.) f)) g) x
~> (((.) f) . g) x
~> ((.) f) (g x)
~> f . g x

もっと原則的に、

(.) :: (b -> c) -> (a -> b) -> (a -> c)

したがって、(.)の最初の引数として使用して、(.)統一する必要があります

b -> c

(v -> w) -> (u -> v) -> (u -> w)

それがもたらす

b = v -> w
c = (u -> v) -> (u -> w)

(.) (.) = ((.) .) :: (a -> v -> w) -> a -> (u -> v) -> (u -> w)

さて、それを に適用するに(.)は、型を統一する必要があります

a -> v -> w

のタイプで(.)、名前を変更した後

(s -> t) -> (r -> s) -> (r -> t)

利回り

a = s -> t
v = r -> s
w = r -> t

したがって

(.) . (.) :: (s -> t) -> (u -> r -> s) -> (u -> r -> t)

そして、(ほとんど)読み取ることができる型から、(.) . (.)(1つの引数の)関数を2つの引数の関数の結果に適用します。

于 2013-02-05T12:48:54.557 に答える
2

あなたはすでに答えを持っています。

組み合わせ論理 (.)ではB -combinator :ですBabc = a(bc)。コンビネータ式を書くとき、式を読みやすくするために、すべての識別子が 1 文字だけで構成されていると想定し、アプリケーション内の空白を省略するのが通例です。もちろん、通常のカリー化が適用されます: abcdeis(((ab)c)d)eおよびその逆です。

(.)Bなので((.) . (.))== (.) (.) (.)== BBBです。そう、

BBBfgxy = B(Bf)gxy = (Bf)(gx)y = Bf(gx)y = (f . g x) y    
 abc        a  bc                 a b  c                  

最後に両方の を捨てることができます(これはeta-reductionyとして知られています: -->が1の中に現れない場合)。しかしまた、これを提示する別の方法は、Gy=HyG=HyH

BBBfgxy = B(Bf)gxy = ((f .) . g) x y = f (g x y)     -- (.) f == (f .)
-- compare with:       (f .) g x = f (g x)

((f .) . g) x yよりも入力しやすいかもしれませんが((.).(.)) f g x y、YMMV.


1たとえば、として定義されたSコンビネータSfgx = fx(gx)では、そのルールに関係なく、次のように書くことができます。

Sfgx = fx(gx) = B(fx)gx = (f x . g) x
Sfg = B(fx)g = (f x . g)   --- WRONG, what is "x"?

これはナンセンスです。

于 2013-02-06T10:45:17.050 に答える