我真的很迷恋 Haskell 中的函数类型。给出了两个函数的类型,我无法解释它们之间的真正区别是什么。
a :: Int -> (Int -> (Int -> (Int -> Int)))
b :: (((Int -> Int) -> Int) -> Int) -> Int
我还是没明白重点。我知道柯里化(Currying)的目的是什么——但我在这个例子中看不到柯里化(Currying)的概念!
函数 a:传入一个 Int
,结果是另一个采用 Int
的结果......依此类推。
函数b:这与函数A有何不同?
最佳答案
也许最好的办法是考虑两个更简单的函数:
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
这是有效的,因为默认情况下我们将 ->
绑定(bind)到右侧。它还为我们提供了另一种理解 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
,依此类推。
关于function - 相似括号函数类型之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15164630/