F# 在F中缩放序列#
我试图通过序列的第一个元素来缩放序列,所以第一个元素总是一个,然后后续元素是原始序列的第一个元素与第n个元素的比率 这是我的密码F# 在F中缩放序列#,f#,sequences,F#,Sequences,我试图通过序列的第一个元素来缩放序列,所以第一个元素总是一个,然后后续元素是原始序列的第一个元素与第n个元素的比率 这是我的密码 open System open System.Collections let squish1 (x:Double seq) = let r = (Seq.head x:Double) Seq.fold (fun (xi:Double) (r:Doub
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|];;
我已经键入了所有内容,因为我收到了此错误消息
fsx(9,1):错误FS0030:值限制。值“it”已被>推断为具有泛型类型
val it:(双精度->双精度->双精度)当'\u a:>序列使“it”的参数显式,或者,如果不希望它是泛型的,则>添加类型注释 但很明显,我误解了,因为即使键入了所有内容,我也会收到错误消息。我错过了什么
我非常感激您的建议。谢谢,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
let inline squish1(x:seq)=
设r=序号x
序列图(趣味n->n/r)x
现在它适用于支持部门的所有类型。谢谢您的建议。我现在得到的答案是0.0!我希望有一个按比例排列的序列?我是否使用了错误的函数(.fold)?是的,这听起来很正确。我已经去掉了|>Seq.skip 1,因为这意味着第一个学期被错过了,但现在这正如预期的那样起作用。非常感谢。哦,刚刚看了修订版。这很好。哈哈,它现在是用r除以x,所以它给出了我想要的答案的倒数!哦,你说得对。您必须使用
Seq.map(fun n->n/r)x
注意,在F中使用别名float
比使用System.Double
更为惯用。是的,我知道。这是我们的开发团队的设计选择,因为我们有时需要处理的数据类型。但是float
只是System.Double
的别名。它们是一样的。kvb只是说在代码中使用float
别名更为惯用-它不会改变程序的行为。有趣的是,它会将您的评论传递给首席开发人员。