Еще одна (менее эффективная) опция
let splitList xs =
let odd, even =
xs
|> List.zip [ 1 .. (List.length xs) ]
|> List.partition (fun (i, _) -> i % 2 <> 0)
[ odd |> List.map snd; even |> List.map snd ]
Если вы хотите избежать создания временных списков, рассмотрите возможность использования последовательностей:
let splitListSeq xs =
xs
|> Seq.mapi (fun i x -> (i % 2 = 0, x))
|> Seq.groupBy (fun (b, _) -> b)
|> Seq.map snd
|> Seq.map ((Seq.map snd) >> Seq.toList)
|> Seq.toList
Еще одна, похожая на версию Дэниела:
let splitListRec xs =
let rec loop l r = function
| [] -> [l; r]
| x::[] -> [x::l; r]
| x::y::t -> loop (x::l) (y::r) t
loop [] [] xs |> List.map List.rev