Нет встроенной функции для нарезки списка, но это можно сделать легко.
Поскольку у нас есть начальная точка и конечная точка, мы можем разбить проблему на две части. Первая часть - это drop
несколько элементов, пока мы не достигнем начальной точки, а вторая часть - это take
несколько элементов от начальной точки до конечной точки.
let rec drop = (n, list) =>
switch (list) {
| [] => []
| [_, ...xs] as z => n == 0 ? z : drop(n - 1, xs)
};
let rec take = (n, list) =>
switch (list) {
| [] => []
| [x, ...xs] => n == 0 ? [] : [x, ...take(n - 1, xs)]
};
теперь, когда у нас есть эти две функции, мы можем объединить их, чтобы отбросить начальные элементы от до начальной точки drop(i, list)
, а затем передать этот новый список, чтобы перенести элементы из начальной точки в конечную точку
take(k - i + 1, drop(i, list));
всего
let slice = (list, i, k) => {
let rec drop = (n, list) =>
switch (list) {
| [] => []
| [_, ...xs] as z => n == 0 ? z : drop(n - 1, xs)
};
let rec take = (n, list) =>
switch (list) {
| [] => []
| [x, ...xs] => n == 0 ? [] : [x, ...take(n - 1, xs)]
};
take(k - i + 1, drop(i, list));
};
Лучшим подходом было бы предоставить начальную точку и затем диапазон, а не конечную точку, потому что здесь мы не ограничиваем, что конечная точка должна быть больше начальной точки
let slice = (list, start, range) => {
let rec drop = (n, list) =>
switch (list) {
| [] => []
| [_, ...xs] as z => n == 0 ? z : drop(n - 1, xs)
};
let rec take = (n, list) =>
switch (list) {
| [] => []
| [x, ...xs] => n == 0 ? [] : [x, ...take(n - 1, xs)]
};
take(range, drop(start, list));
};