「型付き」フロートを取る「汎用」関数の作成に問題があります。
次のモックアップ クラスは、係数 'c' に基づいて、位置の累積誤差を監視することを目的としています。コンパイラは、型の本体で 0.<'a> と言うのが好きではありません (「測定単位リテラルの予期しない型パラメーター」)。
///Corrects cumulative error in position based on s and c
type Corrector(s_init:float<'a>) =
let deltaS ds c = sin (ds / c) //incremental error function
//mutable values
let mutable nominal_s = s_init
let mutable error_s = 0.<'a> //<-- COMPILER NO LIKE
///Set new start pos and reset error to zero
member sc.Reset(s) =
nominal_s <- s
error_s <- 0.<'a> //<-- COMPILER NO LIKE
///Pass in new pos and c to corrector, returns corrected s and current error
member sc.Next(s:float<'a>, c:float<'a>) =
let ds = s - nominal_s //distance since last request
nominal_s <- s //update nominal s
error_s <- error_s + (deltaS ds c) //calculate cumulative error
(nominal_s + error_s, error_s) //pass back tuple
もう1つの関連する質問は、まだ「ジェネリック」関数に関係していると思います。
次のコードで、私がやろうとしているのは、あらゆるタイプのフロートの #seq を受け取り、それを「バニラ」フロートのみを受け入れる関数に適用する関数を作成することです。3 行目で ' Value Restriction ' エラーが発生し、解決方法がわかりません。(#を削除すると問題は解決しますが、リスト、seq、配列などに同じことを書く必要は避けたいです。)
[<Measure>] type km //define a unit of measure
let someFloatFn x = x + 1.2 //this is a function which takes 'vanilla' floats
let MapSeqToNonUnitFunction (x:#seq<float<'a>>) = Seq.map (float >> someFloatFn) x
let testList = [ 1 .. 4 ] |> List.map float |> List.map ((*) 1.0<km>)
MapSeqToNonUnitFunction testList