SML与教会数字
我有一个任务,需要使用数据类型在SML中实现教堂数字:数据类型'a church=C of('a-'a)*'a->'a 我必须编写函数create:int->“一个church和一个函数churchToint 到目前为止,我有以下代码: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
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)=
,以通过模式匹配解压函数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
将在没有警告的情况下编译和运行。