I have the following program:
open System
open MathNet.Numerics
open MathNet.Numerics.LinearAlgebra
//entropy
let entropy v =
let pct = v / v.Sum()
let l1 = pct.Map (fun x -> System.Math.Log(x, 2.0))
let p = Vector.map2 (fun x y -> x * y) pct l1
let e = - p.Sum()
e
[<EntryPoint>]
let main argv =
let v1 = vector [ 1.0 ; 3.0 ; 5.0 ]
let e1 = entropy v1
0 // return an integer exit code
I need to provide a type annotation for the varable v in the entropy function. As you can see, the parameter I am passing to the function (v1) is defined as MathNet.Numerics.LinearAlgebra.vector. I have tried lots of options for the type annotation without success.
What should it be? Bonus points if you can help me understand how you came up with your answer.
This vector type is generic; the generic argument indicates the type of each component of the vector. A type annotation must at least indicate the number of generic arguments, e.g.
Vector<_>
for any such vector, orVector<float>
for the exact type used in the question.In other words,
Vector<_>
andVector
are unrelated types to the compiler. The annotation is supposed to denote the type Vector with one, not zero generic arguments.I would expect the "rough" annotation
(v : Vector<_>)
to suffice; the compiler would then infer the generic argument from the use of a float -- the value 2.0 -- later in the function. I don't use the library though, so I didn't test this.