我试图通过序列的第一个元素来缩放序列,因此第一个元素将始终为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;添加类型注释。
但显然我很误解,因为即使输入了所有内容,我也会收到错误消息。我错过了什么?
感激地收到任何建议。感谢
答案 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
现在它适用于支持分裂的所有类型。