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

标签 function haskell types currying

我真的很迷恋 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::ay::bz::c:

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

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

f :: a -> b -> c

这是有效的,因为默认情况下我们将 -> 绑定(bind)到右侧。它还为我们提供了另一种理解 f 的等效方法:它可以被认为是一个带有两个参数的函数,其类型为 ab,并产生 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/

相关文章:

haskell - 为伟大的利益而学习 Haskell "Syntax in Functions"错误

javascript - 我的函数会将一个值记录到控制台,但它不会返回相同的值 - 为什么?

C++将成员对象函数赋值给类成员函数

haskell - 如何与类型 "Either a b"匹配?

sql - 文本文件的 Oracle 数据类型?

mysql - 经纬度数据类型和存储格式

c - 从 va_arg 宏理解 "(sizeof(t) & (sizeof(t) - 1)) != 0"

function - Haskell - lambda 表达式

python - Python 中只将一个变量传递给函数

Haskell:如何创建一个不允许、一个或两个 Applicative 的函数?