2013-08-06 3 views
4

У меня есть список как [1..12], и я хотел бы получить кусок как [4..9]. Не знаю, как я могу это сделать, я новичок в F #. Я не знаю, есть ли для этого встроенный метод, но я хотел бы знать ручной способ.Как получить кусочек списка?

ответ

4

Чтобы сразу ответить на ваш вопрос: как вы берете часть списка? Согласование шаблонов.

Вы можете использовать сопоставление образцов, чтобы написать функцию, которая извлекает диапазон из списка. Основной алгоритм: пропустить каждый элемент списка, в то время как E < Min, затем возьмите каждый элемент, а E < = Макс.. Что-то вроде этого:

let range min max xs = 
    let rec skipWhile f = function 
    | x::xs when f x -> skipWhile f xs 
    | xs -> xs 
    let rec takeWhile f acc = function 
    | x::xs when f x -> takeWhile f (x::acc) xs 
    | _ -> List.rev acc 
    xs 
    |> skipWhile ((>) min) 
    |> takeWhile ((>=) max) [] 

[1..12] |> range 4 9 
> val it : int list = [4; 5; 6; 7; 8; 9] 
1

Предполагая, что вы использовать Ocaml-как подмножество F # вы, вероятно, хотите использовать стандартный модуль List, вероятно, его filter функцию.

В противном случае можно использовать функцию рекурсивного хвоста с совпадением.

8
[1..12] |> List.filter (fun x -> x >= 4 && x <= 9) 

или

[1..12] |> Seq.skip 3 |> Seq.take 6 |> Seq.toList 

Списки не поддерживают нарезку, но если вы используете массив вместо этого вы можете также сделать это:

[|1..12|].[3..8] 

(обратите внимание 3..8 вместо 4..9 из-за индексации на основе 0)

Смежные вопросы