【问题标题】:What is the reason for a Turing complete type system [duplicate]图灵完整类型系统的原因是什么[重复]
【发布时间】:2016-03-04 07:01:59
【问题描述】:

Scala 和 Haskell 拥有“图灵完备的类型系统”。通常,图灵完备性指的是computations and languages。它在类型上下文中的真正含义是什么?

有人能举例说明程序员如何从中受益吗?

PS 我不想比较 Haskell 和 Scala 的类型系统。更多的是关于一般术语。

PSS 如果可能的话,可以提供更多 Scala 示例。

【问题讨论】:

标签: scala haskell turing-complete


【解决方案1】:

在类型的上下文中它的真正含义是什么?

这意味着类型系统中有足够的特征来表示任意计算。作为一个非常简短的证明,我在下面展示了SK 演算的类型级实现;有很多地方讨论了这种微积分的图灵完备性及其含义,所以我不会在这里重复。

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeOperators #-}

infixl 1 `App`
data Term = S | K | App Term Term

type family Reduce t where
    Reduce S = S
    Reduce K = K
    Reduce (S `App` x `App` y `App` z) = Reduce (x `App` z `App` (y `App` z))
    Reduce (K `App` x `App` y) = Reduce x
    Reduce (x `App` y) = Reduce (Reduce x `App` y)

您可以在 ghci 提示符下看到这一点;例如,在SK 演算中,术语SKSK (最终)减少为K

> :kind! Reduce (S `App` K `App` S `App` K)
Reduce (S `App` K `App` S `App` K) :: Term
= 'K

这里也有一个有趣的尝试:

> type I = S `App` K `App` K
> type Rep = S `App` I `App` I
> :kind! Reduce (Rep `App` Rep)

我不会破坏乐趣 - 自己试试吧。但首先要知道如何终止带有极端偏见的程序。

谁能举例说明程序员如何从中受益?

任意类型级计算允许您在类型上表达任意不变量,并让编译器验证(在编译时)它们是否被保留。想要一棵红黑树?编译器可以检查的红黑树如何保留红黑树不变量?那会很方便,对吧,因为这排除了一整类实现错误?静态已知与特定模式匹配的 XML 值类型怎么样?事实上,为什么不更进一步,写下一个参数化类型,它的参数代表一个模式?然后您可以在运行时读取模式,并让您的编译时检查确保您的参数化值只能表示该模式中格式正确的值。不错!

或者,也许是一个更平淡无奇的例子:如果您希望编译器检查您从未使用不存在的键索引您的字典怎么办?有了足够先进的类型系统,您就可以做到。

当然,总是有代价的。在 Haskell(可能还有 Scala?)中,一个非常令人兴奋的编译时检查的代价是花费大量程序员的时间和精力来说服编译器你正在检查的东西是真实的——这通常都是很高的前期成本以及高昂的持续维护成本。

【讨论】:

  • 我完全同意 Haskell 突出显示乏味。如果至少Uppercase 字有不同的颜色,我会很高兴。但是,我也必须承认,我真的很不喜欢那些坚持给非关键字上色的荧光笔,比如print,就好像它们“特别”一样。
  • 您必须花费如此多的精力来说服类型系统为您证明东西,这与一种说法是同构的,即指定类型计算的语言没有您想要的那么强大。
  • @RexKerr 我不太确定。我想任何一位教授都会告诉你,要让一名研究生为你做一些特定的工作可能需要相当多的说服力。与研究生交流的语言确实相当丰富和强大。或者,暂时将自己置于类型系统中:有些证明很难!
  • 有些证明很难,但这不是让简单任务难以表达的借口。作为存在性证明:我通常发现在 Mathematica 中编写证明比在 Scala 或 Haskell 中编写类型要容易得多。
  • @RexKerr,Mathematica 中的非正式证明无法与正式证明相比。将 Haskell 与 Agda 之类的东西对比起来会更公平一些,尽管 Haskell 的本意并不是在同一意义上完全合理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 2010-09-16
  • 2015-07-25
相关资源
最近更新 更多