创建多参数可管理函数F#

时间:2015-07-22 17:05:17

标签: f#

我想概括我的标准偏差函数以允许计算偏差的倍数,但仍然在管道环境中使用它。我似乎错误地设置了我的功能。

let variance (x:seq<float>) =
let mean = x |> Seq.average
x |> Seq.map(fun x -> (x - mean) ** 2.0)
  |> Seq.average

let stdDeviation (deviations:float, x:seq<float>) =
  sqrt (x |> variance) * deviations 

示例用法是

let sTester = seq{1.0 .. 20.0}
let stdDev = sTester |> stdDeviation 1.0 

我一直收到错误:表达式期望有类型:seq - &gt; a'但这里有类型float

非常感谢帮助。

谢谢,

〜大卫

1 个答案:

答案 0 :(得分:4)

如果您更改stdDeviation以便它需要两个参数,而不是一个元组,那么它可以工作:

let stdDeviation (deviations:float) (x:seq<float>) =
  sqrt (x |> variance) * deviations 

let stdDev = sTester |> stdDeviation 1.0 

这个想法是当你编写let stdDeviation (deviations, x:seq<float>)时,你正在定义一个带有单个参数的函数,该参数实际上是一个元组。

|>运算符的工作方式是它向右侧的函数提供一个参数。因此,如果您只有一个参数(这是一个元组),那么管道并不是那么有用。

但是如果你说let stdDeviation deviations (x:seq<float>)那么你正在定义一个带有两个参数的函数。当您编写input |> stdDeviations 1.0时,您将通过管道提供右侧的第一个参数和左侧的输入(第二个参数)。