在查看Haskell时,我经常会看到与此类似的类型声明:
a -> (b -> c)
我理解它描述了一个函数,它接受类型为a的东西并返回一个新函数,它接受类型为b的东西并返回类型为c的东西。我也理解类型是关联的(编辑:我错了 - 看下面的评论),所以上面的内容可以像这样重写,以获得相同的结果:
(a -> b) -> c
这将描述一个函数,它接受类型为a的东西和类型为b的东西并返回类型为c的东西。
我也听说你可以通过切换箭头来补充(编辑:真的,我在这里寻找的词是双重的 - 请参阅下面的评论)到该功能:
a <- b <- c
我认为相当于
c -> b -> a
但我不确定。
我的问题是,这种数学的名称是什么?我想了解更多关于它的信息,以便我可以用它来帮助我编写更好的程序。我有兴趣学习类似于补充函数的东西,以及可以对类型声明执行的其他转换。
谢谢!
答案 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