Как объясняет JaredPar, вам нужно использовать x::acc
для добавления элементов в аккумулятор. Если вы хотите добавить элементы в конец, вы можете написать acc @ [x]
, но это очень неэффективно, так как необходимо скопировать весь список для каждого отдельного элемента.
Обычное решение - добавить элементы в начало списка, а затем перевернуть список в конце обработки:
let unpair l =
let rec loop acc l =
match l with
| [] -> List.rev acc // NOTE: Reverse the list here
| (x,y)::tl ->
loop (y::x::acc) tl // Add elements to the front
loop [] l
Это намного эффективнее, чем использование acc @ [x]
, потому что он продолжает добавлять элементы вперед (что занимает лишь небольшое постоянное время), а затем создает одну копию всего списка в конце.
Эту же функцию можно также эффективно и эффективно реализовать с помощью выражений последовательности:
let unpair l =
[ for x, y in l do
yield x
yield y ]