Конвейерна обработка за намиране на елемент в индекс

Бих искал да направя следното във F#:

let index = 5
let sequence = [0..10]
let fifthElement =
    sequence
    |> .[index]

Последният ред обаче е невалиден. Това, което бих искал да направя, е действително да извлека елемента с индекс 5 в sequence. Правя ли нещата погрешно?

Доколкото разбирам, конвейеризацията помага да се обърне извикването на функцията, но не съм сигурен как да извлека елемента при конкретен индекс с помощта на конвейеризация.


person matt    schedule 08.09.2012    source източник


Отговори (2)


За list и seq обикновено използвам

let fifthElement = sequence |> Seq.nth index

Можете също да пишете

let fifthElement = sequence |> fun sq -> sq.[index]

или по-сбито без тръбопроводи

let fifthElement = sequence.[index]

за всеки обект с Индексирано свойство.

Предимството на използването на индексирано свойство е, че всъщност е O(1) в масив, докато Seq.nth в масив е O(N).

person pad    schedule 08.09.2012
comment
Не е ли Seq.nth O(N) срещу Array.get O(1)? Може да е O(1) само ако използва тестове за динамичен тип, за да се специализира за масиви, така ли е? - person t0yv0; 09.09.2012
comment
@toyvo: В този случай последователността е списък, така че е O(N). Бих използвал специфична функция за всеки тип, вместо да правя типови тестове - person pad; 09.09.2012

Само актуализация: nth е остарял, вече можете да използвате item за поредици и списъци

пример:

let lst = [0..2..15] 
let result = lst.item 4

резултат = 8

person schmoopy    schedule 14.09.2015