David Crook
David Crook

Reputation: 2730

Create Multi-Parameter Pipeable Function F#

I want to generalize my standard deviation function to allow for calculations of multiples of deviations, but still use it in the context of piping. It appears that I am setting up my function incorrectly.

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 

Example usage would be

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

I keep getting the error: The expression was expecting to have the type: seq -> a' but here has type float

Help is greatly appreciated.

Thanks,

~David

Upvotes: 2

Views: 114

Answers (1)

Tomas Petricek
Tomas Petricek

Reputation: 243041

If you change your stdDeviation so that it takes two parameters, rather than a tuple then it works:

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

let stdDev = sTester |> stdDeviation 1.0 

The idea is that when you write let stdDeviation (deviations, x:seq<float>) then you are defining a function that takes a single parameter that is actually a tuple.

The way the |> operator works is that it supplies one parameter to the function on the right. So if you have just one parameter (which is a tuple), then the pipe isn't all that useful.

But if you say let stdDeviation deviations (x:seq<float>) then you are defining a function with two parameters. When you write input |> stdDeviations 1.0 you are then providing the first parameter on the right hand side and the input (second parameter) on the left via the pipe.

Upvotes: 4

Related Questions