2

我有一个涉及在 SML 中制作教堂数字的作业。我环顾四周,找不到我做错了什么。目标是制作一个接受 int 并返回教堂数字的函数,定义为数据类型 'a numeric = 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;

但这不起作用,并且由于值限制而将错误类型 var 实例化为虚拟类型。

当我使用代码时:

val zero = fn s => fn x => x; 

(定义零)然后

val next = fn n => fn s => fn x => (f ((n s) x));

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

4

1 回答 1

2

我认为您遇到了 SML'97 中的“值多态性”。是讨论它的文档很长的部分。

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

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

于 2012-02-06T08:55:24.040 回答