[英]Functional Programming and Type Systems
我一直在学习各种函数式语言,包括Haskell,Scala和Clojure。 Haskell有一个非常严格且定义良好的静态类型系统。 Scala也是静态类型的。 另一方面,Clojure是动态类型的。
所以我的问题是
语言不需要输入功能 - 函数式编程的核心是lambda演算 ,它是无类型和类型变体。
类型系统扮演两个角色:
在像Haskell这样的高级类型系统中,类型系统可以提供更多好处:
类型系统在函数式语言中扮演什么角色?
对于Simon Marlow的优秀答案,我想补充一个类型系统,特别是包含代数数据类型的系统 ,可以更容易地编写程序:
面向对象语言中的软件设计有时使用UML图表示,使用类型非常清楚地表达。 这种清晰度尤其表现在不仅值具有类型,而且模块具有类型,如在Objective Caml或Standard ML中。
当一个人编写代码时,一些简单的启发式方法可以很容易地根据类型编写纯函数:
case
表达式仔细检查代数数据类型的值,可以消耗它。 基于这些观察结果,以及简单的规则,除非有充分的理由,函数应该使用它的每个参数,否则很容易减少可以写入极少数候选者的可能代码的空间。 例如,没有那么多合理的类型函数(使用Haskell表示法)
forall a . (a -> Bool) -> [a] -> Bool
使用类型创建代码的技术称为类型导向编程。 当它运行良好时,你会听到功能程序员说“一旦我们得到了正确的类型,代码实际上就自己编写了”。 由于类型通常比代码小得多,这是一个很大的胜利。
在函数式语言(以及函数可用作值的任何其他语言)中,类型系统需要知道函数的类型。 除此之外,功能语言的类型系统没有什么特别之处。
在纯函数式语言中,您需要抽象副作用,因此您希望类型系统能够以某种方式支持它。 例如,如果您希望拥有类似于Clean的世界类型,则您希望类型系统支持唯一性类型以确保正确使用。
如果你想在haskell中有一个IO monad,你需要一个IO类型(虽然像haskell这样的monad类型类不需要有一个IO monad,所以你不需要一个支持它的类型系统) 。
1:与其他任何一个相同,它会阻止你进行不明确的操作,或者对人类造成“无意义”的操作。 就像浮点数加上整数一样。
2:Nope是世界上最古老的编程语言,(无类型的)lambda演算,既有功能也有无类型。
3:很难,功能只是意味着没有副作用,没有突变,参考透明等等。
只记得最古老的函数式语言,无类型的lambda演算没有类型系统。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.