2

我有一个任务,我需要使用以下数据类型在 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;

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

4

1 回答 1

2

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

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

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

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

于 2010-09-24T11:00:07.473 回答