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

时间:2013-03-01 18:40:50

标签: function haskell types currying

我真的陷入了Haskell中的函数类型。有两种功能的类型,我无法解释它们之间的真正区别。

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

b :: (((Int -> Int) -> Int) -> Int) -> Int

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

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

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

2 个答案:

答案 0 :(得分:7)

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

f :: a -> (b -> c)
g :: (a -> b) -> c

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

第一个函数f采用类型为a的单个参数,并返回类型为b -> c的函数。换句话说,假设x :: ay :: bz :: c,您可以编写如下内容:

f :: a -> (b -> c)
f x = f'
  where f' :: b -> C
        f' y = z

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

f :: a -> b -> c

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

第二个函数c接受一个参数,它是g类型的函数。

a -> b

因此两者非常不同。

将此函数应用于函数,第一个函数采用g :: (a -> b) -> c g h = z where h :: a -> b 类型的4个值并返回Int。第二个函数采用类型Int的单个函数,该函数采用类型((Int -> Int) -> Int) -> Int的第三个函数并生成(Int -> Int),依此类推。

答案 1 :(得分:3)

函数b将函数作为其参数 - 它不会生成函数作为其结果。这是一个很大的不同:

a 42将生成一个带有其他参数的函数。 b 42会产生类型错误,因为42不是函数。 b myfun myfun类型为((Int -> Int) -> Int) -> Int)的{​​{1}}会生成Inta myfun会导致类型错误,因为myfun不是整数。