我正在学习Haskell。目前,我正在学习函数组合。 我至少在基础层面上理解了如何使用函数(.)
,但有两个方面我还不明白。
所以这个函数长这样:
(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)
首先是类型声明。
(b -> c) ->(a -> b)
基本上意味着函数 f
接受来自函数 g
的结果值(b
),该函数接受值 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)
(这显然是错误的)。
(.) :: Fun1 -> Fun2 -> Fun3
更容易阅读,即(.)
接受一个类型为Fun1
(一个函数)的参数,然后是另一个类型为Fun2
(另一个函数)的参数,并返回一个类型为Fun3
(另一个函数,即“组合”函数)的值。具体来说,Fun1 = (b->c)
,Fun2=(a->b)
,Fun3 = (a->c)
。实际上,在您的类型周围添加括号--它们是隐式的。 - chi\ x->
并不存在单独存在的情况;这里有一个隐含的括号,它会尽可能地向右移动,因此f . g = \ x -> f (g x)
实际上是f . g = (\ x -> f (g x) )
,一个 lambda 函数的符号表示。 - Will Ness