我想概括我的标准偏差函数以允许计算偏差的倍数,但仍然在管道环境中使用它。我似乎错误地设置了我的功能。
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
非常感谢帮助。
谢谢,
〜大卫
答案 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
时,您将通过管道提供右侧的第一个参数和左侧的输入(第二个参数)。