这是什么类型的数学:a - > b - > C

时间:2011-03-27 14:22:19

标签: math haskell types monads

在查看Haskell时,我经常会看到与此类似的类型声明:

a -> (b -> c)

我理解它描述了一个函数,它接受类型为a的东西并返回一个新函数,它接受类型为b的东西并返回类型为c的东西。我也理解类型是关联的(编辑:我错了 - 看下面的评论),所以上面的内容可以像这样重写,以获得相同的结果:

(a -> b) -> c

这将描述一个函数,它接受类型为a的东西和类型为b的东西并返回类型为c的东西。

我也听说你可以通过切换箭头来补充(编辑:真的,我在这里寻找的词是双重的 - 请参阅下面的评论)到该功能:

a <- b <- c

我认为相当于

c -> b -> a

但我不确定。

我的问题是,这种数学的名称是什么?我想了解更多关于它的信息,以便我可以用它来帮助我编写更好的程序。我有兴趣学习类似于补充函数的东西,以及可以对类型声明执行的其他转换。

谢谢!

4 个答案:

答案 0 :(得分:10)

类型声明关联,a -> (b -> c)不等同于(a -> b) -> c。此外,您无法“切换”箭头,a <- b <- c是无效的语法。

在这种情况下,关联性的通常引用是-> right associative,这意味着a -> b -> c被解释为a -> (b -> c)

答案 1 :(得分:5)

从广义上讲,这属于Lambda Calculus的领域。

由于此符号与函数类型type inference有关,因此您可能也会感兴趣。

(关于关联性的错误假设应该已经被其他答案充分理清,所以我不会重申这一点)

答案 2 :(得分:4)

a -> (b -> c) 

(a -> b) -> c

在Haskell中不等于。这就是可以在范畴理论中建立的类型理论。

前者是一个函数,它接受a类型的参数并返回类型为b -> c的函数。而后者是一个函数,它将a -> b类型的函数作为参数并返回c类型的值。

你对函数的补充是什么意思?类型a -> (b -> c)的函数的反函数的类型具有类型(b -> c) -> a

答案 3 :(得分:2)

类型a->b->c的函数,实际上是你所说的函​​数链,是Currying

的例子