стандартный мл добавить элементы в пользовательском типе данных - PullRequest
0 голосов
/ 28 марта 2012

Я хочу создать функцию для нового типа данных в Standard ML, тип данных называется intnest, определяемый следующим образом:

datatype intnest = 
  INT of int
| LIST of intnest list;

, и я хочу создать функцию, которая добавляет все целые числа вВ интлисте я попробовал следующий код:

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 Ответ

0 голосов
/ 28 марта 2012

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

...