1

次のプログラムがあります。

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

エントロピー関数の変数 v に型注釈を付ける必要があります。ご覧のとおり、関数 (v1) に渡すパラメーターは、MathNet.Numerics.LinearAlgebra.vector として定義されています。型注釈の多くのオプションを試しましたが、成功しませんでした。

それは何ですか?どうやって答えを思いついたのかを理解するのを手伝ってくれればボーナスポイント。

4

1 に答える 1

3

このベクター型は汎用です。汎用引数は、ベクトルの各コンポーネントの型を示します。型注釈は、少なくとも一般的な引数の数を示す必要があります。たとえばVector<_>、そのようなベクトルの場合、またはVector<float>質問で使用される正確な型の場合です。

つまり、Vector<_>andVectorはコンパイラとは関係のない型です。注釈は、0 ではなく 1 つのジェネリック引数を持つ Vector 型を示すことになっています。

「大まかな」注釈(v : Vector<_>)で十分だと思います。コンパイラは、関数の後半で float (値 2.0) の使用からジェネリック引数を推測します。私はライブラリを使用していないので、これをテストしませんでした。

于 2014-11-19T17:31:32.217 に答える