Обратный список SML со списком аккумуляторов

Я пытаюсь выполнить функцию на SML, которая инвертирует первый список, а затем объединяет его со вторым списком (что-то вроде: list1 = [5,3,1] и list 2 = [6 7 8], затем inv (list1, list2) = [1,3,5,6,7,8].) Вот код:

fun inv (nil,nil) = []
|inv (ha::ta,hb::tb) = 
 if ha = [] then ta::(hb::tb)
 else  ha::inv(ta,hb::tb);

Он возвращает это:

Ошибка: типы ветвей, если не совпадают [цикличность], затем ветвь: '' Z список список список иначе ветвь: '' Z список список в выражении:

если ha = nil, то ta :: hb :: tb else ha :: inv (ta, ::)

Кто-нибудь может мне помочь с этим, пожалуйста?


person Breno Santos    schedule 02.09.2013    source источник
comment
Как насчет: fun inv (xs, ys) = rev xs @ ys   -  person Simon Shine    schedule 03.09.2013


Ответы (2)


fun inv ([], b) = b
 |  inv (h::t, b) = inv(t, h::b)

Обратите внимание, что сопоставление с образцом во втором списке не требуется. Это канонический пример хвостовой рекурсивной функции; это способ перевернуть список с постоянным пространством стека. Вы ошиблись при использовании cons (: :), где первый аргумент имел тип 'a list.

person seanmcl    schedule 02.09.2013

Поскольку вы работаете со списками, если ha = [], то в list1 не осталось другого термина.

person timmur    schedule 02.09.2013
comment
Нет. ha является заголовком списка, что означает, что если ha = [], то это список списков, который начинается с пустого списка, что вовсе не является намерением. - person Tayacan; 03.09.2013