Как создать кортеж интервалов из массива? - PullRequest
1 голос
/ 26 февраля 2010

Я пытаюсь построить обычную числовую функцию, чтобы получить массив чисел с плавающей запятой, а затем вернуть массив кортежей, разбивающий массив на N диапазонов равного расстояния, где каждый кортеж представляет нижнюю и верхнюю границы каждого диапазона , Первый элемент первого кортежа в результирующем массиве должен быть минимумом входного массива, а второй элемент последнего кортежа в результирующем массиве должен быть максимумом входного массива.

Моя проблема в том, что я пытаюсь решить эту проблему с помощью сопоставления с шаблоном, и мой код компилируется, но ничего не создается (?) Я получаю предупреждение о том, что третий шаблон никогда не совпадет. Я озадачен, потому что я думал, что я охватил все дела - 1-е, последнее, а затем все промежуточное. Заранее благодарим за любые хорошие идеи о том, как исправить этот код.

let rand1000 = [| for i in 1..1000 do yield rnd.NextDouble() |]


let intervals (arr: float array) (n : int) =
    let L = Array.min(arr);
    let U = Array.max(arr);
    let increment = U - L / (float n);
    let maxGroup = n-1;
    [| for i in 0..maxGroup do 
          let range = match i with
                      | 0 -> L, L + increment
                      | maxGroup -> L + (float n) * increment, U
                      | _ -> L + (float n) * increment, L + (float (n + 1)) * increment
          yield range
    |]

let inters = intervals rand1000;

Ответы [ 2 ]

5 голосов
/ 26 февраля 2010

3-й шаблон никогда не будет совпадать, потому что maxGroup соответствует любому значению. В блоках сопоставления могут использоваться только буквальные значения, не очень интуитивно понятные. Вы создаете имя переменной локальной области действия, привязанное к сопоставленному шаблону. Вы хотите использовать предложение when, например:

| _ when i = maxGroup -> L + (float n) * increment, U

Это просто соответствует любому значению, когда я равен maxGroup.

У Криса Смита есть несколько примеров, которые лучше демонстрируют эту функцию: http://blogs.msdn.com/chrsmith/archive/2008/10/03/f-zen-the-literal-attribute.aspx

0 голосов
/ 09 февраля 2012

Эта dice функция разбивает последовательность на группы n элементов:

let dice n xs =
  Seq.mapi (fun i x -> i/n, x) xs
  |> Seq.groupBy fst
  |> Seq.map (fun (_, xs) -> Seq.map snd xs)

Эта функция minMaxIntervals использует dice для сопоставления последовательности, а затем отображает функции min и max на полученные интервалы:

let minMaxIntervals n xs =
  dice n xs
  |> Seq.map (fun xs -> Seq.min xs, Seq.max xs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...