我正在学习 Haskell。目前,我正在研究函数组合。我了解(至少在基本层面上)(.)
的功能如何可以使用,但有两件事我不明白。
所以函数看起来如下:
(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)
首先,类型声明。
(b -> c) -> (a -> b)
本质上意味着函数f
从函数 b
的结果值 ( g
) 中获取参数(取值 a
)并返回 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)
(这显然又是错误的)。
最佳答案
(b -> c) -> (a -> b) -> c
将是一个带有两个函数的函数 f :: b -> c
和 g :: a -> b
,并以某种方式调用g
没有 a
类型的初始参数.
对于第二个问题,考虑如何定义 (.)
改为使用前缀表示法。 (如果我们为函数使用“常规”名称可能更容易看出;我将在每个代码片段之后将其作为注释包含在内):
(.) f g x = f (g x) -- compose f g x = f (g x)
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)
您还可以使用括号来隐式定义函数:
(f . g) x = f (g x)
关于haskell - 函数组合 (.) 如何从内部工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57772488/