Удаление из списка в F # - PullRequest
       21

Удаление из списка в F #

0 голосов
/ 07 сентября 2018

Мне нужна помощь с конкатенацией строк на F #.

Учитывая целое число n и список l, я должен удалить все вхождения n в l. Например:

 remove 1 (L(1, L(2, L(3, E)))) should give me L(2, L(3, E))

мой код:

type ilist = E | L of int * ilist


let rec remove n l =
match l with
| E -> []
| L(h,E) -> if (h=n) then remove h (L(h,E))
            else [h, E]
| L(h,t) -> if (h=n) then remove h t
            else [h :: (remove n t)] 

Я получаю сообщение об ошибке типа, говорящее, что последняя строка должна иметь тип int * ilist
но тут есть тип 'список

любая помощь будет оценена! спасибо

1 Ответ

0 голосов
/ 07 сентября 2018

Основная проблема является распространенной. Вы переносите результат в [], забывая, что h :: remove n t - это уже список. Итак, моя исправленная версия:

let rec remove n l =
  match l with
    | E -> []
    | L(h,t) -> if (h = n) then remove n t
                           else h :: (remove n t)

Обратите внимание, что вы можете избавиться от своего среднего случая, потому что он может быть аккуратно решен путем сопоставления t с E.

Я также изменил ваш remove h на remove n; хотя они гарантированно были равны, я думаю, что это лучше показывает, что n является «постоянным» параметром для рекурсивной функции.

...