0

我想为标准 ML 中的新数据类型创建一个函数,该数据类型称为 intnest,定义如下:

datatype intnest = 
  INT of int
| LIST of intnest list;

我想创建一个函数来添加 intlist 中的所有整数,我尝试了以下代码:

fun addup (INT n) = n
  | addup (LIST x::xs) = x + addup(xs);

我究竟做错了什么?

编辑:

我还尝试了以下方法:

fun addup (INT n) = n
  | addup (LIST x::xs) = addup(x) + addup(xs);

所以 x 是 INT 类型,所以第一个选项返回它的 int 值,而 addup(xs) 是一个递归调用,返回相同的第二个选项。

还尝试了以下方法:

fun addup (INT n) = n
  | addup (LIST []) = 0
  | addup (LIST x::xs) = addup(x) + addup(LIST xs);

但我收到以下错误:

stdIn:146.4-151.50 Error: parameter or result constraints of clauses don't agree [tycon mismatch]
  this clause:      intnest list -> 'Z
  previous clauses:      intnest -> 'Z
  in declaration:
    addup =
      (fn INT n => n
        | LIST nil => 0
        | :: (<pat>,<pat>) => addup <exp> + addup <exp>)
stdIn:151.25-151.50 Error: operator and operand don't agree [tycon mismatch]
  operator domain: intnest
  operand:         intnest list
  in expression:
    addup x
4

1 回答 1

0

一是case中存在语法错误LIST;摆脱of. 您会希望外壳看起来像addup (LIST(x::xs)) = ....

更重要的是,在addup. 所需的类型addup似乎是intnest -> int。因此有必要确保addup始终应用于intnest值和返回int值。

现在考虑列表元素的类型x::xs。您将其定义为LIST of intnest list,因此x也是intnest。但是在 中addup,您将x其视为整数。

同样,xs是 a intnest list,但那不是 a intnest,这就是您将其视为 in 的内容addup(xs)。您的修订版解决了 . 的问题x,但没有解决xs. 您需要intnestxsusing中创建一个LIST,这意味着您需要使用addup(LIST xs).

最后,你错过了一个案例。当你有时会发生什么LIST []

第三个版本不起作用,因为您缺少所需的括号。编译器告诉您您正在使用 aintnest list作为案例之一(::案例)。也就是说,它LIST x::xs认为(LIST x) :: xs

于 2012-03-28T09:11:23.733 回答