2011-10-25 3 views
2

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

Вот мой код,

 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
Либо сделайте аргументы «явным», либо, если вы этого не сделаете намеревайтесь, чтобы он был общим,> добавьте аннотацию типа.

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

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

+1

Обратите внимание, что в F # более идиоматично использовать псевдоним 'float', а не' System.Double'. – kvb

+0

Да, я знаю. Это был выбор дизайна нашей командой разработчиков из-за типов данных, которые нам иногда приходится обрабатывать. –

+1

Но 'float' - просто псевдоним' System.Double'. Это одно и то же. kvb просто говорит, что более идиоматично использовать псевдоним 'float' в вашем коде - он ничего не меняет о поведении вашей программы. –

ответ

4

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 

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

+0

Спасибо за совет. Теперь я получаю 0.0 в качестве ответа! Я надеялся на масштабированную последовательность? Я использую неправильную функцию (.fold)? –

+2

Да. Я думаю, вы хотите «карта». Я обновил свой ответ. – Daniel

+0

Да, это звучит прямо сейчас. Я избавился от> Seq.skip 1 , так как это означало, что первый термин был упущен, но сейчас он работает так, как ожидалось. Огромное спасибо. –

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