我想为Standard 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
答案 0 :(得分:0)
首先,LIST
案例中存在语法错误;摆脱of
。您希望案例看起来像addup (LIST(x::xs)) = ...
。
更重要的是,addup
中存在概念性问题。所需的addup
类型似乎是intnest -> int
。因此,有必要确保addup
始终应用于intnest
值并返回int
值。
现在考虑列表x::xs
的元素类型。您将其定义为LIST of intnest list
,因此x
是intnest
。但是在addup
中,您将x
视为整数。
同样,xs
是intnest list
,但这不是intnest
,这就是你在addup(xs)
中所采用的方式。您的修订版本解决了x
的问题,而不是xs
的问题。您需要使用intnest
从xs
发出LIST
,这意味着您需要使用addup(LIST xs)
。
最后,你错过了一个案例。当你LIST []
时会发生什么?
第三个版本不起作用,因为您缺少必需的括号。编译器告诉您,您正在使用intnest list
作为其中一个案例(::
案例)。也就是说,它将LIST x::xs
视为(LIST x) :: xs
。