让我说:
t = \x y -> x.y
其类型为:
*Main> :t t
t :: (b -> c) -> (a -> b) -> a -> c
如果我正确理解,x.y
可以写为x(y)
,这意味着我们首先求解y
的{{1}},然后求解(b -> c)
的x (b -> a)
只是函数中的参数;我们给a -> c
(x)和a
(y)。 这正确吗?如果不正确,我该怎么读? c
是什么意思,(b -> c) -> (a-> b)
是哪个x
。
我该如何阅读:
y
这里t1 = \x y z -> x.y.z
*Main> :t t1
t1 :: (b1 -> c) -> (b2 -> b1) -> (a -> b2) -> a -> c
是什么b1
,这是如何工作的?当我有3个参数作为输入时,为什么在-> c处?请帮助我理解这一点
答案 0 :(得分:3)
写函数类型(b -> c) -> (a -> b) -> a -> c
的更好方法是(b -> c) -> (a -> b) -> (a -> c)
,其中(a -> c)
周围有明确的括号。此重写试图使该函数清楚不带三个参数并返回类型为c
的东西。它带有两个参数,并返回类型为(a -> c)
的函数。这是currying的概念,它是Haskell编程 1 不可或缺的部分。
在您的第一个示例中,(b -> c)
是x
,而(a -> b)
是y
。返回类型(a -> c)
是通过组合参数函数获得的新函数。
您的第二个示例可以用相同的方式解释。 (b1 -> c)
对应于x
,(b2 -> b1)
对应于y
,而(a -> b2)
对应于z
。返回类型是通过首先组合z
和y
以获得类型(a -> b1)
的函数,然后将此函数与a
组合以获得类型{{1}的函数而获得的}。该函数最终返回什么。
1:实际上,最正确的说法是该函数接受类型为(a -> c)
的一个参数并返回类型为(b -> c)
的函数,但这并不是特别重要。