也许最好的办法是考虑两个更简单的函数:
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:可以将其视为一个函数,该函数接受两个类型为aand的参数,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,依此类推。