SML中的Alonzo Church数字

时间:2012-02-06 02:16:19

标签: sml church

我的作业涉及用SML制作教堂数字。我环顾四周,找不到我做错了什么。目标是创建一个带有int的函数并返回一个教堂数字,定义为数据类型'a numbers = Num of('a - >'a) - > 'a - > 'a(由我的老师预先定义)。然后制作第二个函数,它接受一个教堂数字并返回一个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 next = fn n => fn s => fn x => (f ((n s) x));

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

1 个答案:

答案 0 :(得分:2)

我认为你在SML'97中遇到了“价值多态”。 Here是讨论它的很长篇文档。

一种解决方法是,只要有表达式导致此问题,例如: next zero,围绕它包裹一个函数,例如fn x => next zero x

我认为你可以做的另一件事是,不是在解释器的顶级评估定义,而是将定义和使用它的所有代码包装到本地范围(例如,在let ... in ... end内)或函数。< / p>