Haskell:为什么((.).(.))fg等于f.GX?

use*_*097 8 haskell types combinators pointfree function-composition

你能解释一下表达式的含义((.).(.))吗?据我所知(.)有类型(b - > c) - >(a - > b) - > a - > c.

Dan*_*her 22

(.) . (.) 是组合运算符本身的组成.

如果我们看一下

((.) . (.)) f g x
Run Code Online (Sandbox Code Playgroud)

我们可以评估几个步骤,首先我们括起来,

((((.) . (.)) f) g) x
Run Code Online (Sandbox Code Playgroud)

然后我们申请,使用(foo . bar) arg = foo (bar arg):

~> (((.) ((.) f)) g) x
~> (((.) f) . g) x
~> ((.) f) (g x)
~> f . g x
Run Code Online (Sandbox Code Playgroud)

更有原则的,

(.) :: (b -> c) -> (a -> b) -> (a -> c)
Run Code Online (Sandbox Code Playgroud)

因此,使用(.)作为第一个参数(.),我们必须统一

b -> c
Run Code Online (Sandbox Code Playgroud)

(v -> w) -> (u -> v) -> (u -> w)
Run Code Online (Sandbox Code Playgroud)

产量

b = v -> w
c = (u -> v) -> (u -> w)
Run Code Online (Sandbox Code Playgroud)

(.) (.) = ((.) .) :: (a -> v -> w) -> a -> (u -> v) -> (u -> w)
Run Code Online (Sandbox Code Playgroud)

现在,要应用它(.),我们必须统一类型

a -> v -> w
Run Code Online (Sandbox Code Playgroud)

(.)重命名后的类型

(s -> t) -> (r -> s) -> (r -> t)
Run Code Online (Sandbox Code Playgroud)

产量

a = s -> t
v = r -> s
w = r -> t
Run Code Online (Sandbox Code Playgroud)

因此

(.) . (.) :: (s -> t) -> (u -> r -> s) -> (u -> r -> t)
Run Code Online (Sandbox Code Playgroud)

从我们可以(几乎)读取的类型,(.) . (.)将一个函数(一个参数)应用于两个参数的函数的结果.