Важным моментом является то, что функция неверна . Сбой при вводе ([1;2;3], [])
, так как вы пропустили регистр (xs, [])
при сопоставлении с образцом. Более того, аргументы лучше в форме карри, чтобы их было легче использовать с частичным применением. Вот исправленная версия:
let rec interleave xs ys =
match xs, ys with
| [], ys -> ys
| xs, [] -> xs
| x::xs', y::ys' -> x::y::interleave xs' ys'
Вы можете видеть, что функция не является хвостовой рекурсией , поскольку она применяет конструктор cons (::)
дважды после возврата рекурсивного вызова. Один интересный способ сделать его хвост-рекурсивным - использовать выражение последовательности:
let interleave xs ys =
let rec loop xs ys =
seq {
match xs, ys with
| [], ys -> yield! ys
| xs, [] -> yield! xs
| x::xs', y::ys' ->
yield x
yield y
yield! loop xs' ys'
}
loop xs ys |> List.ofSeq