从扩展的角度来看,西蒙基本上是正确的。我们非常了解现代功能语言的语义,它们实际上是彼此的相对较小的变体-它们各自代表一种单语成语的翻译形式。甚至像Scheme这样的语言(具有一流控制的动态类型的高阶命令式语言)也具有与ML和Haskell的语义非常接近的语义。
从一个指称点,您可以通过给一个非常简单的域方程方案的语义开始-称之为。人们可以并且确实在70年代末80年代初就解决了这样的方程式,所以这还不错。同样,Scheme也有相对简单的操作语义。(请注意,当我说“方案”时,我的意思是未类型化的lambda演算加上连续性加上状态,而不是像所有真实语言一样具有一些疣的实际Scheme。)V
但是要进入适合于解释现代类型功能语言的类别,事情就变得很恐怖。基本上,您最终在该域上构造了一个超等效的部分等价关系类别。(例如,请参阅Birkedal,Stovring和Thamsborg的“参数多态性,通用参考和递归类型的可实现性语义”。)偏爱操作语义的人们将这些东西称为逐步索引逻辑关系。(例如,参见艾哈迈德(Ahmed),德雷尔(Dreyer)和罗斯伯格(Rossberg)的“状态依赖表示独立性”。)无论哪种方式,使用的技术都是相对较新的技术。
a -> b
⟨ 一个⟩ →交通Ť⟨ b ⟩⟨ 一个⟩ →交通⟨ b ⟩Ť(一)⟨ 一 ⟩a
→
因此,就等式理论而言,由于这些语言都可以通过翻译成同一语言的稍有不同的子集来描述,因此将它们彼此称为语法变体是完全公平的。
ML和Haskell之间的感觉差异实际上是由两种语言的内涵特性引起的,即执行时间和内存消耗。ML具有组成性能模型(即程序的时间/空间成本可以从其子术语的时间/空间成本计算得出),就像真正的按名称调用语言一样。实际的Haskell是通过按需调用(一种回忆)来实现的,因此其性能不是基于组合的-与变量绑定的表达式需要花多长时间来评估,取决于它是否曾被使用过。我上面提到的语义没有对此进行建模。
如果您想更认真地对待内涵特性,那么ML和Haskell确实会表现出更大的差异。仍然有可能为它们设计一个通用的元语言,但是类型的解释将以更加系统的方式有所不同,这与聚焦的证明理论有关。了解这一点的一个好地方是Noam Zeilberger的博士学位论文。