【问题标题】:Scaling a sequence in F#在 F# 中缩放序列
【发布时间】:2011-10-25 15:16:19
【问题描述】:

我正在尝试通过序列的第一个元素来缩放序列,因此第一个元素将始终为一个,然后后续元素是原始序列的第一个元素与第 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
要么明确“它”的参数,要么,如果你不打算让它是通用的,>添加一个类型注释。

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

感谢您收到任何和所有建议。谢谢

【问题讨论】:

  • 请注意,在 F# 中使用别名 float 而不是 System.Double 更为惯用。
  • 是的,我知道。由于我们有时必须处理的数据类型,这是我们的开发团队的设计选择。
  • 但是float 只是System.Double 的别名。他们是一样的。 kvb 只是说在您的代码中使用 float 别名更为惯用 - 它不会改变您程序的行为。
  • 很有趣,会将您的 cmets 传递给首席开发人员。

标签: f# sequences


【解决方案1】:

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 作为答案!我希望有一个按比例缩放的序列?我是否使用了错误的函数 (.fold)?
  • 是的,现在听起来。我已经摆脱了 |> Seq.skip 1 ,因为这意味着第一个术语被错过了,但现在按预期工作。非常感谢。
  • 哦,刚看到修改版。这非常整洁。
  • 哈哈它现在是用 r 除以 x 的项,所以它给出了我想要的答案的倒数!
  • 哎呀,你是对的。你必须使用Seq.map (fun n -&gt; n / r) x
猜你喜欢
  • 2020-09-30
  • 2011-08-01
  • 1970-01-01
  • 2018-06-22
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
相关资源
最近更新 更多