繁体   English   中英

标准ml在自定义数据类型中添加元素

[英]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 ,因此xintnest 但是在addup ,您将x视为整数。

同样, xs是一个intnest list ,但这不是一个intnest ,这就是您在addup(xs)对待它的方式。 您的修订版解决了x的问题,但没有解决xs 你需要做的intnestxs使用LIST ,这意味着你需要使用addup(LIST xs)

最后,您缺少一个案例。 当您拥有LIST []怎样?

第三个版本不起作用,因为您缺少必需的括号。 编译器告诉您,您将使用intnest list作为一种情况( ::情况)。 也就是说,它将LIST x::xs视为(LIST x) :: xs

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM