Sml 如何分配具有自由类型变量的表达式,就像分配其他函数f作为val x=f:?

Sml 如何分配具有自由类型变量的表达式,就像分配其他函数f作为val x=f:?,sml,smlnj,ml,Sml,Smlnj,Ml,我如何分配一个带有自由类型变量的表达式,就像我分配其他函数f作为val x=f: 我有 fun curry f x y = f (x,y); val dummy = fn (x,y) => {a=x,b=y} (* or anything with free type *) val dummCd = fn x=> fn y=> {a=x,b=y} 我以为“咖喱傻瓜”会像“傻瓜”一样工作,但是 dummCd val it = fn: 'a -> 'b -&

我如何分配一个带有自由类型变量的表达式,就像我分配其他函数f作为val x=f:

我有

 fun curry f  x  y = f (x,y);
 val dummy = fn (x,y) => {a=x,b=y}  (* or anything with free type *)
 val dummCd = fn x=> fn y=> {a=x,b=y}
我以为“咖喱傻瓜”会像“傻瓜”一样工作,但是

 dummCd
 val it = fn: 'a -> 'b -> {a: 'a, b: 'b}

因此,当分配时,这将变得无用。 我可以这样做:

 fun x a b =curry dummy a b ;  
但这有点笨拙。当我把我在这里所做的,放到一个函数中

 val a = fn tr => (fn a=> fn b=> tr a b)
 val x = a (curry dummy)
 val x = fn : ?.X1 -> ?.X2 -> {a:?.X1, b:?.X2}
我也有同样的问题。 如何分配“curry dummy”而不使用额外的a和b?我是说像

 val x =  a ( curry dummy )
其中a可能是一个函数,x的行为类似于dummCd


谢谢你的提示

很遗憾,你不能做你想做的事

在标准ML'97中,如果绑定的右侧是“非扩展”表达式,则值声明只能绑定类型变量,这意味着它符合表达式语法的一个非常严格的子集,因此无法生成任何新的引用单元格或异常名称。由于这是一个语法检查,它根本不考虑
curry
的定义;您知道
curry
不会创建任何ref单元格或异常名称(因此
val dummCd=curry dummy
是安全的),但编译器在这一点上看到的是
curry dummy
调用了一个可以执行这些操作的函数

因此,如果您希望使用任意类型调用
dummCd
(也就是说,您希望它具有非平凡类型方案)∀αβ.α→β→{a:α,b:β}和绑定类型变量),然后需要使用例如
val dummCd=fn…
fun dummCd…
来声明它;你不能只在右边写你想要的任何东西


在这方面,标准ML'90更为宽松-它将有关
curry
行为的相关信息编码到类型系统中(如果涉及任何ref单元格或异常名称的类型,则将类型变量标记为“命令”,例如
“\u a
而不是
'a
),并使用该类型信息来决定是否允许
val dummCd=curry dummy
绑定其类型变量-但该系统被认为过于混乱和复杂,特别是因为它将实现细节强制写入签名,因此,它在标准ML'97中被废弃,取而代之的是当前的仅语法系统,在该系统中,所有类型变量都被假定为必须的。

非常清楚,谢谢。我发现我可以将示例进一步简化为
valy=(fnx=>x)
valy=(fnx=>x)(fnx=>x)
,在第二种情况下,我必须约束type@jordyTTx:不客气。除了我刚刚意识到我的解释不是100%正确之外,如果
val dummCd=curry dummy
是一个构造函数,那么像
curry
这样的东西可以绑定一个类型变量;例如,
val someOfNil:'a list option=SOME nil
就可以了。这不是严格的语法检查,因为标识符状态是静态语义的一部分,而不是语法。但出于您的目的,因为
curry
不是构造函数,所以它等于同一件事。
 val x =  a ( curry dummy )