[英]standard ml add elements in a custom datatype
我想为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
首先,在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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.