SML与教会数字

SML与教会数字,sml,Sml,我有一个任务,需要使用数据类型在SML中实现教堂数字:数据类型'a church=C of('a-'a)*'a->'a 我必须编写函数create:int->“一个church和一个函数churchToint 到目前为止,我有以下代码: datatype 'a church = C of ('a -> 'a) * 'a -> 'a val ZERO = C(fn (f,x) => x) fun subCreate 0 (f,x) = x | subCreate n (f

我有一个任务,需要使用数据类型在SML中实现教堂数字:数据类型'a church=C of('a-'a)*'a->'a

我必须编写函数create:int->“一个church和一个函数churchToint 到目前为止,我有以下代码:

datatype 'a church = C of ('a -> 'a) * 'a -> 'a
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 cn = cn (fn x => x + 1) 0;

我知道我很接近。你能帮我正确地执行吗?谢谢

你说得对,你很接近。churchToInt函数中只有两个小错误:

  • 你没有打开教堂的数字。也就是说,您将参数
    cn
    视为函数,但
    churchToInt
    应接受包含函数的
    C
    ,而不是函数本身。因此,将其更改为
    fun churchToInt(cn)=
    ,以通过模式匹配解压函数

  • 您使用curry样式将两个参数应用于函数,但是
    C
    已定义为包含一个采用元组的函数。因此,不要写
    cn(fnx=>x+1)0
    ,而是写
    cn((fnx=>x+1),0)


  • 通过这两个更改,您的代码可以正常工作。

    我这样做了,但是仍然是get churchToInt:int church->int而不是'a church'。此外,当我运行时,例如:创建5;我得到:“由于值限制而没有通用化的警告类型汽车被实例化为虚拟类型(X1,X2,…).val it=C fn:?.X1 church”@tester:当然类型是
    int church->int
    。如果类型为
    'a church->int
    ,则不允许传入类型为
    int->int
    的函数。如果赋值真的需要你定义一个类型为
    'a church->int
    的函数,我敢说它是不可解的——至少在给定的类型定义下是不可解的。但是函数create呢,我的意思是它正在工作,例如churchToInt(create 5)返回5,但每当我运行create时,它总是让我觉得很奇怪error@tester:这不是一个错误。这是一个警告。如果愿意,可以通过给它一个显式类型来消除它。例如,
    val myCn:int church=create 5
    将在没有警告的情况下编译和运行。