【问题标题】:What's the relationship between pattern matching and type system?模式匹配和类型系统有什么关系?
【发布时间】:2014-06-22 12:24:51
【问题描述】:

在 scala 和其他一些语言(Haskell、SML)中,我们可以使用模式匹配,例如:

val user: Option[User] = findUser(123)
user match {
    case Some(u) => ...
    case _ => ...
}

我对模式匹配和类型系统的关系有一些疑问:

  1. “静态类型系统”是否必须支持模式匹配?
  2. 是否有任何“动态类型系统”语言支持模式匹配?

更新:

感谢@Eran 的回答。

我知道有很多语言不支持模式匹配,例如 c/c++/java/python/ruby/javascript/lisp(我可以在这个列表中添加“bash”吗?)

如果我们要给它们添加“模式匹配”,理论上有哪些语言可以添加呢?还有哪些语言无论如何都做不到呢?

【问题讨论】:

    标签: scala pattern-matching type-systems


    【解决方案1】:

    我假设您的意思是一般值的模式匹配。几乎任何语言的库函数都支持字符串模式匹配(正则表达式)的特殊情况。

    模式匹配和类型检查策略是独立的语言“特性”。 模式匹配是将值与模式进行匹配,然后将成功的匹配绑定到变量的过程。 如果类型检查分别在编译时或运行时强制执行,则类型系统是静态的或动态的。

    一种语言可以具有这两种特征的四种组合中的任何一种,例如:

    • C/C++/Java 是不支持模式匹配的静态类型语言。
    • Haskell/Scala 是支持模式匹配的静态类型语言。
    • Icon 是一种支持模式匹配的动态类型语言。
    • JavaScript 是一种不支持模式匹配的动态类型语言。

    实际上,我发现模式匹配实际上可以用作计算的基础非常有趣。如果这激起了您的好奇心,您可以搜索 Barry Jay 的关于模式微积分的工作。

    【讨论】:

    • 如果我们想在c/c++/java/javascript中加入“模式匹配”功能,理论上可行吗?
    • 理论上是的。但事情往往会迅速升级。想想如果你想添加模式匹配并保持静态类型检查你需要做什么(提示:你需要以某种方式增加编译过程)。
    • @Eran not only in theory(顺便说一句,这不是唯一的实现)
    • @om-nom-nom 我的意思并不是严格意义上的理论。只是为了强调,这并不是一件容易实现的事情。当你的语言是图灵完备的时候,一切皆有可能。我骑在马上。