Стандартный мл добавить элементы в пользовательском типе данных
Я хочу создать функцию для нового типа данных в 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
,