Функция для поиска не только минимального значения последовательности, но и ее индекса в F # - PullRequest
1 голос
/ 03 февраля 2012

У меня есть последовательность, и мне нужно найти как минимальное значение последовательности, так и индекс этого значения в последовательности - фактически какую-то функцию «Seq.mini» вдоль строк Seq.mapi или Seq.iteri.

Какой самый чистый / идиоматичный способ выразить это в F #?

Идиоматически, я должен ожидать написать функцию, которая возвращает кортеж (значение, индекс) или (индекс, значение), и если да, то существует ли соглашение, для какого порядка должны появляться эти значения?

Еще одна вещь: если существует более одного элемента с одинаковым минимальным значением, мне нужен индекс первого вхождения - я думаю, это переводит в строго «меньше чем (<)» сравнение, а не «меньше или равно (<=) "- правильно? </p>

Ответы [ 3 ]

5 голосов
/ 03 февраля 2012

Это простое чистое решение:

let mini s = s |> Seq.mapi (fun i x -> (i, x)) |> Seq.minBy snd
let index, value = seq [3;6;1;5;1] |> mini
1 голос
/ 04 февраля 2012

Я расскажу об этом подробнее и определю две обычно полезные функции.

(* Infinite sequence of whole numbers. 0 .. *)
let indices = Seq.unfold (fun x -> Some(x, x + 1)) 0

(* Zips the given sequence with indices of elements. *)
let zipWithIndex coll = Seq.zip coll indices

printfn "%A" ([12; 8; 9; 90; 3; 24] |> zipWithIndex |> Seq.minBy fst) // prints (3, 4)
0 голосов
/ 03 февраля 2012

Как насчет этого

let tuple a b = a, b
let uncurry f (a, b) = f a b

module Seq =
    let inline miniBy f seq =
        (Seq.mapi tuple
        >> Seq.minBy (uncurry f)) seq

Seq.miniBy (fun i x -> x) [ 4; 6; 3; 7; 2; 2; 7 ]

?

Функция предиката получает индекс, но в этом случае его не нужно использовать.

Примечание: miniBy : (int -> 'a -> 'b) -> seq<'a> -> int * 'a when 'b : comparison

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...