Я написал эту функцию F #, чтобы разбить список до определенной точки и не дальше - как перекресток между takeWhile
и partition
.
let partitionWhile c l =
let rec aux accl accr =
match accr with
| [] -> (accl, [])
| h::t ->
if c h then
aux (h::accl) t
else
(accl, accr)
aux [] l
Единственная проблема в том, что "взятые" элементы меняются на противоположные:
> partitionWhile ((>=) 5) [1..10];;
val it : int list * int list = ([5; 4; 3; 2; 1], [6; 7; 8; 9; 10])
Помимо использования вызова rev
, существует ли способ, которым эта функция могла бы быть записана, чтобы первый список был в правильном порядке?