3

我真的很喜欢 Haskell 中的函数类型。给出了两种函数的类型,我无法解释它们之间的真正区别是什么。

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

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

我还是不明白这一点。我知道柯里化的目的是什么——但在这个例子中我看不到柯里化的概念!

function a: anInt被传入,结果是 another 接受一个Int... 以此类推。

功能 b:这与功能 A 有何不同?

4

2 回答 2

7

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

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

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

第一个函数 ,f接受一个类型的参数a,并返回一个类型的函数b -> c。换句话说,假设x :: ay :: 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,依此类推。

于 2013-03-01T18:49:08.410 回答
3

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

a 42将产生一个带有附加参数的函数。b 42将产生类型错误,因为42它不是函数。b myfunwhere myfunhas type((Int -> Int) -> Int) -> Int)将产生一个Int. a myfun将导致类型错误,因为myfun不是整数。

于 2013-03-01T18:47:36.360 回答