SML/NJ除了在SML’97定义。

向量表达式和模式

向量是同构的、不可变的数组(请参见矢量结构)。矢量是SML\'97的标准功能,但SML/NJ也有特殊功能向量表达式和向量模式的语法。在SML’97中,向量只能通过调用函数来创建从Vector结构,并且无法进行模式匹配。

向量表达式

#[经验0, ...,经验n个]

(其中n个>= 0)创建长度向量n+1谁的元素是相应子表达式的值。与相同其他聚合表达式,则计算元素表达式从左到右。矢量可以通过矢量模式进行模式匹配表单的

#[拍打0, ...,拍打n个]

这样的模式将只匹配相同长度的向量值。

矢量表达式和矢量模式更紧凑、更高效与列表相比,运行时表示的成本与记录相当。

Or-patterns公司

SML/NJ还扩展了模式的语法,以允许“or-patterns。”基本语法是:

(阿帕特1| ... |阿帕特n个)

其中阿帕特是原子模式。另一个限制是每个阿帕特必须相同,并且具有相同的类型。一个简单的例子是:

乐趣 (f) (“y” | “是”) = 真实的
  | (f) _ = 

其含义与:

乐趣 (f) “y” = 真实的
  | (f) “是” = 真实的
  | (f) _ = 

引用和反引用

ML最初的用法是M(M)埃塔L(左)操作对象中术语的语言语言(通常是逻辑;最初是LCF,或Scott的“可计算函数的逻辑”)。最初的LCF/ML具有解析一种特定对象语言(称为OL公司). 新泽西州标准ML支持对于任意对象语言,具有用户提供的对象语言解析。

高阶模块

标准ML的模块系统一直支持一阶中的参数化模块的形式仿函数(又名模块功能). 但有时人们会想对函子和结构进行参数化,这需要真正的高阶模块系统(例如,请参见幂集函子示例).自0.93版(1993年2月)起,SML/NJ提供了模块系统的高阶扩展。

functor的参数化可以用一个简单的通过允许函子成为结构的组件。从语法上来说,这只能通过允许functor来实现结构体中的声明,并通过提供语法签名中的函子规范。Functor规格为已经是1990年标准ML定义的模块语法的一部分(图8,第14页),因此我们实现了该语法并将其添加到_spec语法类(图7,第13页)。此外,它很方便有一种声明函子签名和一些语法的方法咖喱函子糖的定义及其部分应用curry函子,因此提供了这些函子。此扩展名是该语言的“向上兼容”浓缩不中断现有程序。

作为结构组件的函数。

在扩展语言中,签名可以包含函子规范:

签名 信号 =
信号发生器
  类型 t吨
  val值  : t吨
  函子 F类(X(X): 信号发生器 类型 
                   val值 b条: 
               结束) : 信号发生器 val值 x个 : t吨 * X(X). 结束
结束

为了匹配这样的签名,允许结构包含函子宣言:

结构 S公司 : 信号 =
结构
  类型 t吨 = 整数
  val值  = 
  函子 F类(X(X): 信号发生器 类型  val值 b条:  结束) = 结构 val值 x个 = (,X(X).b条) 结束
结束

这使得通过将函子包含为参数结构或结果结构的组件。这个案子下例说明函子参数的。

签名 单体 =
信号发生器
  类型 t吨
  val值 : t*t(吨) -> t吨
  val值 e(电子): t吨
结束;

(*函子签名声明*)
funsig公司  (结构 M(M): 单体
             结构 N个: 单体) = 单体

函子 方形(结构 X(X): 单体
                函子 生产: 产品): 单体 =
  生产(结构 M(M) = X(X)
       结构 N个 = X(X));

请注意,此示例涉及函子签名 产品.

目前函子签名声明采用以下形式之一:

funsig公司 滑稽的(喘鸣:六倍x射线光电子能谱) =六倍x射线光电子能谱
funsig公司 滑稽的(规格)=六倍x射线光电子能谱
警告
此语法被视为临时语法,可能会更改(但尚未更改自0.93起发生变化)。

在结果中返回函子的函子的一个常见用法是用多参数近似curried函子。这里是如何定义curried幺半群乘积函子:

函子 当前生产 (M(M): 单体) =
结构
  函子 产品1 (N个: 单体) : 单体 =
    结构
      类型 t吨 = M(M).t吨 * N个.t吨
      val值 e(电子) = (M(M).e(电子), N个.e(电子))
      乐趣 ((平方米,n1个),(平方米,氮气))=(M(M).(平方米,平方米),N个.(n1个,氮气))
    结束;
结束

这是可行的,但这个函子的部分应用很尴尬,因为它需要显式创建中间产物结构:

结构 IntMonoid公司 =
结构
  类型 t吨 = 整数
  val值 e(电子) = 0
  val值  = (操作 +): 整数*整数 -> 整数
结束;

结构 打临时工 = 当前生产(IntMonoid公司);

函子 产品Int = 打临时工.产品1;

为了简化这类函子的使用,一些派生形式为curried函子定义和部分提供语法糖应用程序。因此,可以编写上述示例:

函子 当前生产 (M(M): 单体) (N个: 单胚的) : 单体 =
结构
  类型 t吨 = M(M).t吨 * N个.t吨
  val值 e(电子) = (M(M).e(电子), N个.e(电子))
  乐趣 ((平方米,n1个),(平方米,氮气))=(M(M).(平方米,平方米),N个.(n1个,氮气))
结束;

函子 产品Int = 当前生产(IntMonoid公司);

函子签名和函子声明的curried形式的语法并针对相应的部分应用进行了总结如下:

funsig公司 滑稽的(标准1) ... (标准n个) =六倍x射线光电子能谱

函子 滑稽的(标准1) ... (标准n个) =strexp公司

函子 功能1=功能2(参数1) ... (参数n个)结构 喘鸣=滑稽的(参数1) ... (参数n个)

哪里

标准::=身份证件:六倍x射线光电子能谱|规格
参数::=strexp公司|12月

在部分应用程序定义函子的情况下,假设那个功能2在右手边需要比n个参数,而在结构声明的情况下滑稽的应该正好n个论据。作为退化情况,其中n=0我们有身份函子声明:

函子 功能1=功能2

还有一种“let”形式的函子表达式:

fctexp公司::= 12月 在里面 fctexp公司 结束

它只能用于形式的函子定义:

函子 滑稽的= 12月 在里面 fctexp公司 结束

curried函子声明

函子 fctid公司(标准1) ... (标准n个) =strexp公司

是转换为以下声明的派生形式

函子 F类(标准1) =结构
  函子 %催化裂化%(标准2) ... (标准n个) =strexp公司
结束

和声明

结构 S公司=F类(参数1) ... (参数n个)函子 =F类(参数1) ... (参数n个)

衍生形式分别扩展为:

地方的
  结构 %隐藏%=F类(参数1)在里面
  结构 S公司=%隐藏%.%催化裂化%(参数2) ... (参数n个)结束

地方的
  结构 %隐藏%=F(参数1) ... (参数n个)在里面
  函子 =%隐藏%.%催化裂化%
结束

目前没有检查完整的参数集在应用curried函子定义结构时提供,如以下示例所示:

函子  (X(X): 信号发生器 类型  结束) (Y(Y): 信号发生器 类型 t吨 结束) =
结构
  类型 u个 = X(X). * Y(Y).t吨
结束

结构 A类 = 结构 类型  = 整数 结束

结构 S公司 =  (A类)  (*Foo A产生(无用)结构*)

函子  =  (A类)    (*Foo A产生函子*)

当然,结构S公司这样定义是没有用的,因为我们不能使用伪标识符%催化裂化%选择其函子组件。这是一个错误,arity应该在将来的版本中添加防止此类错误的检查。