也许是做的最好的事情就是想约两简单的功能:
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
和b
,并产生c
类型的结果。
第二个函数g
带有一个参数,它是类型为a -> b
的函数。
g :: (a -> b) -> c
g h = z
where h :: a -> b
因此这两者是非常不同的。
将此应用于您的函数,第一个函数需要4个值类型为Int
并返回Int
。第二个函数采用类型为((Int -> Int) -> Int) -> Int
的单个函数,并且这是一个函数,其采用类型为(Int -> Int)
的第三个函数,并生成Int
,依此类推。