【问题标题】:SML and church numeralsSML 和教堂数字
【发布时间】:2010-09-24 01:19:37
【问题描述】:

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

我必须编写函数 create :int -> 'a 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;

我知道我已经很接近了。您能帮我正确实施吗?谢谢

【问题讨论】:

    标签: sml


    【解决方案1】:

    你是对的,你很接近。 ChurchToInt 函数中只有两个小错误:

    1. 你没有拆开教堂数字的包装。 IE。你把你的论点 cn 当作一个函数,但 churchToInt 应该接受一个 C 包含一个函数,而不是一个函数本身。所以改成fun churchToInt (C cn) =,通过模式匹配解包函数。

    2. 您正在使用 curry 样式对函数应用两个参数,但 C 已被定义为包含一个采用元组的函数。所以不要写cn (fn x => x+1) 0,而是写cn ((fn x => x+1), 0)

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

    【讨论】:

    • 我这样做了,但仍然是 getchurchToInt:int Church -> int 而不是 'a Church.此外,当我运行例如:create 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 它总是给我那个奇怪的错误
    • @tester:这不是错误。这是一个警告。如果你愿意,你可以通过给它一个显式类型来让它消失。例如。 val myCn : int church = create 5 将在没有警告的情况下编译和运行。
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多