2017-02-14 15 views
-1

Я пытаюсь пропустить тип данных, SET, который содержит другие типы данных, включая сам, и распечатывать эти типы данных с помощью цикла.sml list [tycon несоответствие] операнд и оператор не согласны

fun printEXP(SET(hd::tl::[])) = 
    let  
    fun loop (hd::tl) = printEXP(hd):: loop tl | loop [] = []; 
    in() end; 
... 

У меня возникла ошибка несоответствия tycon, и я не уверен, как ее исправить. Что я делаю неправильно в своей функции цикла?

operator domain: EXP list 
operand: EXP 

где

datatype EXP = SET of EXP list; 
+0

Ваша ошибка в строке 3, а точнее 'printEXP (hd)'. Это потому, что 'hd' имеет тип EXP, и ваша функция принимает список EXP. – rshah

ответ

0

Проблема с функцией является то, что printEXP принимает EXP list аргумент, в то время как ваш hd поставляет EXP типа.

Чтобы обойти это, вы, вероятно, должны иметь другие вещи в своем EXP типах. Поэтому вы должны - в своей функции печати - исследовать другие типы.

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

Например:

datatype EXP = INT of int | SET of EXP list; 

fun printEXP (INT i) = print (Int.toString i) 
    | printEXP (SET (hd::tl)) = do main set things 
    | printEXP (SET []) = do empty set things 

Надеется, что это помогает

+0

-1, извините. Эта функция принимает аргумент «EXP». (Обратите внимание, что 'SET' является конструктором типа' EXP list -> EXP'.) Проблема на самом деле связана с 'loop tl', потому что' tl' имеет тип 'EXP' (а не тип' EXP list' как предполагалось). – ruakh

+0

@ruakh, но проблема начинается с 'hd', да' tl' также создает проблему, вот где я предложил функции правильно пройти через список EXP в моем ответе. – rshah

+0

Я не понимаю, почему вы думаете, что есть проблема с 'hd'.Сообщение об ошибке OP показывает точно противоположное тому, что вы описываете. – ruakh

2

Этой картина:

SET(hd::tl::[]) 

означает SET ___, где аргумент является список ровно с двумя элементами, hd и tl. (. Это эквивалентно SET [hd, tl])

Вместо этого вы имели в виду, чтобы написать:

SET(hd::tl) 

означающий SET ___ где аргумент представляет собой список с, по меньшей мере, один элемент, hd; tl - это список всех элементов после hd (при наличии).

Но то, что вы должны действительно на запись:

SET xs 

означающий SET ___ где аргумент является любой список вообще, называется xs. На этом этапе вам не нужно деконструировать xs; скорее, ваша внутренняя функция loop обрабатывает деконструкцию, и (что еще более важно) также обрабатывает случай, когда список пуст.