Стандартный мл добавить элементы в пользовательском типе данных

Я хочу создать функцию для нового типа данных в 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

1 ответ

Решение

Во-первых, есть синтаксическая ошибка в 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,

Другие вопросы по тегам