模式匹配和类型系统之间有什么关系?

Fre*_*ind 4 type-systems scala pattern-matching

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

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

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

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

更新:

感谢@Eran的回答.

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

如果我们想为它们添加"模式匹配",理论上可以添加哪些语言?在任何情况下,哪些语言都无法做到?

Era*_*ran 6

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

模式匹配和类型检查策略是独立的语言"功能".模式匹配是将值与模式匹配并且成功匹配然后绑定到变量的过程.如果在编译时或运行时强制执行类型检查,则类型系统是静态的或动态的.

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

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

切线地,我发现模式匹配实际上可以用作计算的基础非常有趣.你可以搜索Barry Jay的模式演算工作,如果这会激起你的好奇心.