Sml 如何分配具有自由类型变量的表达式,就像分配其他函数f作为val x=f:?
我如何分配一个带有自由类型变量的表达式,就像我分配其他函数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 -&
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 )