功能编程和类型系统

Abh*_*kar 15 type-systems programming-languages functional-programming clojure

我一直在学习各种函数式语言,包括Haskell,Scala和Clojure.Haskell有一个非常严格且定义良好的静态类型系统.Scala也是静态类型的.另一方面,Clojure是动态类型的.

所以我的问题是

  1. 类型系统在函数式语言中扮演什么角色?
  2. 语言是否有必要使用类型系统才能使其正常运行?
  3. 语言的"功能"级别与语言类型系统的类型有何关联?

Sim*_*low 40

语言不需要输入功能 - 函数式编程的核心是lambda演算,它是无类型和类型变体.

类型系统扮演两个角色:

  • 它在编译时提供了一种保证,即在运行时不会发生一类错误.错误类通常包括尝试将两个字符串添加到一起,或尝试将整数应用为函数.
  • 它具有一些效率优势,因为运行时的对象不需要携带它们的类型,因为类型已经在编译时建立.这被称为类型擦除.

在像Haskell这样的高级类型系统中,类型系统可以提供更多好处:

  • 重载:使用一个标识符来引用不同类型的操作
  • 它允许库根据其使用的类型自动选择优化的实现(使用Type Families)
  • 它允许在编译时证明强大的不变量,例如红黑树中的不变量(使用广义代数数据类型)


Nor*_*sey 13

类型系统在函数式语言中扮演什么角色?

对于Simon Marlow的优秀答案,我想补充一个类型系统,特别是包含代数数据类型的系统,可以更容易地编写程序:

  • 面向对象语言中的软件设计有时使用UML图表示,使用类型非常清楚地表达.这种清晰度尤其表现在不仅具有类型,而且模块具有类型,如在Objective Caml或Standard ML中.

  • 当一个人编写代码时,一些简单的启发式方法可以很容易地根据类型编写纯函数:

    • 始终可以使用lambda创建函数类型的值.
    • 通过应用它可以始终消耗函数类型的值.
    • 可以通过应用任何类型的构造函数来创建代数数据类型的值.
    • 通过用case表达式仔细检查代数数据类型的值可以消耗它.

    基于这些观察,以及简单的规则,除非有充分的理由,函数应该使用它的每个参数,否则很容易减少可以写入极少数候选者的可能代码的空间.例如,没有那么多合理的类型函数(使用Haskell表示法)

    forall a . (a -> Bool) -> [a] -> Bool
    
    Run Code Online (Sandbox Code Playgroud)

    使用类型创建代码的技术称为类型导向编程. 当它运行良好时,你会听到功能程序员说"一旦我们得到了正确的类型,代码实际上就自己编写了". 由于类型通常比代码小得多,这是一个很大的胜利.