let f *** g = fun (a, b) -> (f a, g b)
let biApply f = f *** f
let splitAt n list =
let splitter ((xs, ys), n') c =
if n' < n then
((c :: xs, ys), n' + 1)
else
((xs, c :: ys), n' + 1)
List.fold splitter (([], []), 0) list
|> fst
|> biApply List.rev
printfn "%A" (splitAt 3 [2; 90; 1; 22])
bGV0IGYgKioqIGcgPSBmdW4gKGEsIGIpIC0+IChmIGEsIGcgYikKCmxldCBiaUFwcGx5IGYgPSBmICoqKiBmCgpsZXQgc3BsaXRBdCBuIGxpc3QgPSAKICBsZXQgc3BsaXR0ZXIgKCh4cywgeXMpLCBuJykgYyA9CiAgICBpZiBuJyA8IG4gdGhlbgogICAgICAoKGMgOjogeHMsIHlzKSwgbicgKyAxKQogICAgZWxzZQogICAgICAoKHhzLCBjIDo6IHlzKSwgbicgKyAxKQogIExpc3QuZm9sZCBzcGxpdHRlciAoKFtdLCBbXSksIDApIGxpc3QgCiAgfD4gZnN0IAogIHw+IGJpQXBwbHkgTGlzdC5yZXYKCnByaW50Zm4gIiVBIiAoc3BsaXRBdCAzIFsyOyA5MDsgMTsgMjJdKQ==