类似括号函数类型之间的差异

Tor*_*röm 3 haskell types function currying

我真的陷入了Haskell中的函数类型.给出了两种函数的类型,我无法解释它们之间的真正区别.

a :: Int -> (Int -> (Int -> (Int -> Int)))

b :: (((Int -> Int) -> Int) -> Int) -> Int
Run Code Online (Sandbox Code Playgroud)

我仍然不明白这一点.我知道currying的目的是什么 - 但我在这个例子中看不到currying的概念!

函数a:Int传入一个,结果是另一个传递Int...等等.

功能b:这与功能A有什么不同?

Nic*_* Wu 7

也许最好的办法是考虑两个更简单的功能:

f :: a -> (b -> c)
g :: (a -> b) -> c
Run Code Online (Sandbox Code Playgroud)

让我们依次看看这些功能.

第一个函数f采用类型的单个参数a,并返回类型的函数b -> c.换句话说,你可以写类似下面的假设x :: a,y :: b以及z :: c:

f :: a -> (b -> c)
f x = f'
  where f' :: b -> C
        f' y = z
Run Code Online (Sandbox Code Playgroud)

写签名的另一种方法f是:

f :: a -> b -> c
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为默认情况下我们绑定->到右边.它还为我们提供了另一种等效的理解方式f:它可以被认为是一个带有两个参数的函数,类型ab,并产生类型的结果c.

第二个函数g接受一个参数,它是类型的函数a -> b.

g :: (a -> b) -> c
g h = z
  where h :: a -> b
Run Code Online (Sandbox Code Playgroud)

因此两者非常不同.

将此函数应用于您的函数,第一个函数采用4个类型的值Int并返回一个Int.第二个函数采用类型的单个函数((Int -> Int) -> Int) -> Int,这是一个函数,它接受类型的第三个函数(Int -> Int)并生成一个Int,依此类推.