也许最好的办法是考虑两个更简单的函数:
f :: a -> (b -> c)
g :: (a -> b) -> c
让我们依次看看这些功能。
第一个函数 ,f
接受一个类型的参数a
,并返回一个类型的函数b -> c
。换句话说,假设x :: a
、y :: b
和,您可以编写如下内容z :: c
:
f :: a -> (b -> c)
f x = f'
where f' :: b -> C
f' y = z
另一种书写签名的f
方式如下:
f :: a -> b -> c
这是有效的,因为默认情况下我们绑定->
到右侧。它还为我们提供了另一种等效的理解方式f
:可以将其视为一个函数,该函数接受两个类型为a
and的参数,b
并产生一个类型为 的结果c
。
第二个函数g
接受一个参数,它是一个类型为 的函数a -> b
。
g :: (a -> b) -> c
g h = z
where h :: a -> b
因此,两者是非常不同的。
将此应用于您的函数,第一个函数采用 4 个类型值Int
并返回一个Int
. 第二个函数接受一个 type((Int -> Int) -> Int) -> Int
的函数,这个函数接受第三个 type 的函数(Int -> Int)
并产生一个Int
,依此类推。