SML中的阿隆佐教堂数字

SML中的阿隆佐教堂数字,sml,church,Sml,Church,我有一个任务,涉及用SML制作教堂数字。我环顾四周,就是找不到我做错了什么。目标是生成一个函数,该函数接受int并返回一个church数字,定义为数据类型'a numeric=Num of('a->'a)->'a->'a->'a(由我的老师预定义)。然后生成第二个函数,该函数接受一个church数字并返回一个int 我以前看到过一篇带有代码的帖子: val ZERO = C(fn (f,x) => x) fun subCreate 0 (f,x) = x | subCreate n

我有一个任务,涉及用SML制作教堂数字。我环顾四周,就是找不到我做错了什么。目标是生成一个函数,该函数接受int并返回一个church数字,定义为数据类型'a numeric=Num of('a->'a)->'a->'a->'a(由我的老师预定义)。然后生成第二个函数,该函数接受一个church数字并返回一个int

我以前看到过一篇带有代码的帖子:

val ZERO = C(fn (f,x) => x)
fun subCreate 0 (f,x) = x
   | subCreate n (f,x) = f (subCreate (n-1) (f,x))
fun create n = C(fn (f,x) => subCreate n (f,x));
fun churchToInt (c, cn) = cn ((fn x => x+1), 0) 0;
val zero = fn s => fn x => x; 
但这不起作用,并且由于值限制,错误类型变量没有被泛化,而是被实例化为伪类型

当我使用代码时:

val ZERO = C(fn (f,x) => x)
fun subCreate 0 (f,x) = x
   | subCreate n (f,x) = f (subCreate (n-1) (f,x))
fun create n = C(fn (f,x) => subCreate n (f,x));
fun churchToInt (c, cn) = cn ((fn x => x+1), 0) 0;
val zero = fn s => fn x => x; 
(定义零)然后


(在设置迭代或递归函数之前,我只是做一个测试,看看是否可以增加零),我得到了相同的错误。我在这个问题上花了好几个小时,无法写出一个教堂数字。有人能给我指出正确的方向吗?

我想你在SML'97中遇到了“价值多态性”。是一个非常长的文档部分,讨论它

一种解决方法是,每当您有一个导致此问题的表达式时,例如
next zero
,就在其周围包装一个函数,例如
fn x=>next zero x


我认为您可以做的另一件事是,不要在解释器的顶层评估定义,而是将定义和使用它的所有代码包装到本地范围(例如,在
let…in…end
)或函数中。

我在写了这篇文章后尝试了包装,但没有帮助lol,同样的问题。接下来我将检查您链接的文档。