Масштабирование последовательности в F # - PullRequest
2 голосов
/ 25 октября 2011

Я пытаюсь масштабировать последовательность по первому элементу последовательности, поэтому первый элемент всегда будет равен единице, а затем последующие элементы представляют собой отношение первого элемента к n-му элементу исходной последовательности.

Вот мой код,

       open System
       open System.Collections

           let squish1 (x:Double seq) =
                let r =  (Seq.head x:Double)
                Seq.fold (fun (xi:Double) (r:Double) -> xi/r);;

И я проверяю на этом маленьком векторе: -

                squish1 [|5.0; 1.0; 1.0; 1.0; 1.0; 1.0|];;

Я набрал все, потому что я получаю это сообщение об ошибке

normaliseSequence.fsx (9,1): ошибка FS0030: ограничение значения. Значение 'it' было> выведено, чтобы иметь универсальный тип val it: (Double -> '_a -> Double) когда' _a:> seq
Либо сделайте аргументы для 'it' явными, либо, если вы не собираетесь использовать его в качестве универсального,> добавьте аннотацию типа.

Но, очевидно, я неправильно понимаю, потому что я получаю сообщение об ошибке, даже когда все напечатано Чего мне не хватает?

Любой и все советы с благодарностью получены. Спасибо

1 Ответ

4 голосов
/ 25 октября 2011

fold ожидает еще два параметра, начальное значение и последовательность. Это работает:

let squish1 (x:Double seq) =
    let r =  (Seq.head x:Double)
    Seq.fold (fun (xi:Double) (r:Double) -> xi/r) 0.0 x

Однако, я предполагаю, что вы, вероятно, хотите map вместо fold:

let squish1 (x:Double seq) =
    let r =  (Seq.head x:Double)
    Seq.map (fun (xi:Double) -> xi/r) x

Кстати, я бы написал так:

let inline squish1 (x:seq<_>) =
  let r = Seq.head x
  Seq.map (fun n -> n / r) x

Теперь это работает для всех типов, которые поддерживают деление.

...