缩放F#中的序列

时间:2011-10-25 15:16:20

标签: f# sequences

我试图通过序列的第一个元素来缩放序列,因此第一个元素将始终为1,然后后续元素是原始序列的第一个元素与第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:值限制。价值'它'已被推断为具有泛型类型      val it :( Double - >' _a - > Double)当' _a:> SEQ
  要么将论据提到'它'显式或,如果您不打算通用,> gt;添加类型注释。

但显然我很误解,因为即使输入了所有内容,我也会收到错误消息。我错过了什么?

感激地收到任何建议。感谢

1 个答案:

答案 0 :(得分: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

现在它适用于支持分裂的所有类型。