SML - оператор и операнд не согласуются

У меня есть такая простая функция:

val CLC_seq=
       fn (n) =>
       (Cons (n, find_CLC_seq(COL_seq(n))))

Когда:

find_CLC_sqe is : int seq -> int;
COL_seq is: fn: int -> int seq;

Составитель написал:

Error: operator and operand don't agree
operator domain: int * (Unit -> int seq)
operand: int * int
in expression: 
 (Cons (n, find_CLC_seq(COL_seq(n))))

Какова причина? Как я могу это решить? Спасибо.


sml
person Tom    schedule 27.05.2011    source источник


Ответы (1)


Что ж, непонятно, что именно вы пытаетесь сделать, но компилятор прав, когда замечает вас. find_CLC_seq возвращает int, что означает, что ваш Cons пытается использовать int на int. Это не имеет смысла, потому что cons - для добавления элемента в начало списка (ваша функция Cons ожидает поместить int в начало ленивой последовательности, (Unit -> int seq)).

Я не знаю, что такое CLC и COL, но похоже:

Ваше определение CLC_seq неверно, потому что, если find_CLC_seq действительно должен возвращать int, нет смысла использовать его таким образом;

ИЛИ ваше определение find_CLC_seq неверно, и его возвращаемый тип должен быть int seq или ленивой последовательностью, как следует из названия. В этом случае ошибка заключается в фрагменте кода, который вы нам не показали.

person Nicholas Wilson    schedule 27.05.2011
comment
Большое спасибо, но я до сих пор не понимаю, в чем проблема. find_CLC_seq возвращает int (как я уже писал: find_CLC_sqe is: int seq - ›int;). так что он будет делать Cons (int, int). Почему компилятор видит его как Unit - ›int seq? - person Tom; 27.05.2011
comment
Да, ваш код пытается преобразовать int в int (это означает, что он говорит 'operand: int * int'). Конструктору Cons не нужны эти аргументы; он предназначен для использования в качестве int в последовательности. Тип Cons будет int * (Unit -> int seq) -> (Unit -> int seq), что означает, когда он говорит, что ввод для «домена оператора». «Операнд» - это то, что вы пытались передать, а «домен оператора» - это то, что вы должны передать. - person Nicholas Wilson; 27.05.2011
comment
Вы сами написали find_CLC_seq? Если да, то вы намеревались вернуть int? Я вижу, что это так, но вы этого хотите? Судя по названию функции, она должна возвращать последовательность, и в этом случае может быть ошибка. - person Nicholas Wilson; 27.05.2011
comment
find_CLC_seq возвращает int! компилятор написал мне, что find_CLC_sqe: int seq - ›int ;. find_CLC_sqe сохраняет местоположение первого числа 5, которое появляется в последовательности. - person Tom; 27.05.2011
comment
Перед этим я определил: datatype 'a seq = Nil | Минусы 'a * (unit - ›' a seq) ;. Может в этом проблема? Почему компилятор не может делать минусы int * int? - person Tom; 27.05.2011
comment
Он не может делать минусы int * int, потому что это не имеет смысла. Ваш тип данных выглядит нормально, откуда бы вы его ни взяли. Вам нужно будет объяснить, что тогда функция CLC_seq предназначена для этого. Не могли бы вы опубликовать свой полный код и вопрос, который вы пытаетесь решить, чтобы мы могли увидеть, что пытается решить код? - person Nicholas Wilson; 27.05.2011
comment
Последний вопрос, обещаю: почему я не могу делать cons (int int)? Если мне нужна пара int int, как мне это сделать? - person Tom; 27.05.2011
comment
Cons добавляет элемент в начало списка, который может продолжаться некоторое время. Пара элементов (кортеж) по определению имеет фиксированную длину, поэтому вы не можете использовать Cons для их создания. Пара int, int*int, просто создается с помощью (..,..). Если вы хотите, чтобы CLC_seq возвращал пару целых чисел, просто избавьтесь от слова «Минусы» в коде вашего вопроса. - person Nicholas Wilson; 27.05.2011