函数组合(。)如何从内部工作?

Mit*_*kan 4 syntax lambda haskell function-composition

我正在学习Haskell。目前,我正在研究功能组合。我了解(至少在基本层面上)如何使用函数(.),但是有两点我不了解。

因此该函数如下所示:

(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)
Run Code Online (Sandbox Code Playgroud)

首先,类型声明。(b -> c) -> (a -> b)本质上是指函数f从函数的结果value(bg(取value a)中取参数并返回type的value c。我不明白下面的部分-> a -> c,为什么要在-> a那里?为什么(b -> c) -> (a -> b) -> c错了?从我的观点(显然是错误的)来看,函数g已经a作为参数了。

第二,主体的功能f . g = \x -> f (g x)\x ->在这里做什么?Lambda非常简单。例如filter (\(a,b) -> a + b > 4) [(1,2),(3,4)],但是简单\x ->会使我陷入困境。我可能会这样写正文f . (g x) = f (g x)(显然这又是错误的)。

che*_*ner 7

(b -> c) -> (a -> b) -> c将是一个函数,它有两个功能f :: b -> cg :: a -> b,并以某种方式调用g,而不类型的初始参数a

对于第二个问题,请考虑如何(.)使用前缀符号进行定义。(可能更容易看出我们是否对该函数使用“常规”名称;我将在每个代码段后的注释中包括该名称):

(.) f g x = f (g x)    -- compose f g x = f (g x)
Run Code Online (Sandbox Code Playgroud)

x是的“第三个参数” (.),或更确切地说是所返回函数的参数(.) f g。这等效于(.) f g通过将一个函数放在右侧而不是该函数的最终返回值来直接定义为一个函数:

(.) f g x =       f (g x)  -- Implicit function def: compose f g x =       f (g x)
(.) f g   = \x -> f (g x)  -- Explicit function def: compose f g   = \x -> f (g x)
Run Code Online (Sandbox Code Playgroud)

您还可以使用括号来隐式定义函数:

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