【问题标题】:standard ml add elements in a custom datatype标准 ml 在自定义数据类型中添加元素
【发布时间】:2012-03-28 18:07:29
【问题描述】:

我想为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

【问题讨论】:

    标签: function types sml ml


    【解决方案1】:

    首先,LIST 情况下存在语法错误;摆脱of。您会希望机箱看起来像 addup (LIST(x::xs)) = ...

    更实质上,addup 存在概念问题。 addup 的所需类型似乎是 intnest -&gt; int。因此有必要确保addup 始终应用于intnest 值并返回int 值。

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

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

    最后,您遗漏了一个案例。当您拥有LIST [] 时会发生什么?

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

    【讨论】:

    • 我不太明白你的意思,xs不是intnest列表吗?
    • @aizen92 是的,就是这样。但是addup 需要的类型是intnest。您的LIST 案例使用intnest list 实现,但不是 intnest list。比较xsLIST xs 的类型可能会有所帮助。
    • 问题在于 x::xs 之间的括号,但我不太明白为什么会这样,x::xs 不被认为是一个列表吗?
    • @aizen92 :: 是列表的类型构造函数,类似于intnest 数据类型中的LISTINT。 SML 在模式匹配时使用它来解构列表。这就是为什么:: 的情况出现在错误消息中的原因。
    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多