Haskell 中的点运算符
我试图了解点运算符在此 Haskell 代码中的作用:
sumEuler = sum . (map euler) . mkList
简短的回答
没有点的等效代码,就是
sumEuler = \x -> sum ((map euler) (mkList x))
或没有 lambda
sumEuler x = sum ((map euler) (mkList x))
因为点 (.) 表示函数组合。
更长的答案
euler
首先,让我们简化to的部分应用map
:
map_euler = map euler
sumEuler = sum . map_euler . mkList
现在我们只有点。这些点表示什么?
从来源:
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)
这(.)
就是compose 运算符。
撰写
在数学中,我们可以将函数 f(x) 和 g(x) 的组合,即 f(g(x)) 写成
(f ∘ g)(x)
可以读作“f 由 g 组成”。
所以在 Haskell 中,f ∘ g 或 f 由 g 组成,可以写成:
f . g
组合是关联的,这意味着使用组合运算符编写的 f(g(h(x))) 可以省略括号而不会产生任何歧义。
也就是说,由于 (f ∘ g) ∘ h 等价于 f ∘ (g ∘ h),我们可以简单地写成 f ∘ g ∘ h。
盘旋回来
回到我们之前的简化,这个:
sumEuler = sum . map_euler . mkList
只是意味着这sumEuler
是这些功能的未应用组合:
sumEuler = \x -> sum (map_euler (mkList x))