私は静的型システムでいくつかの関数を表現できない状況のために、F#の動的機能を調べようとしています。そのため、Option
タイプのmapN
関数を作成しようとしていますが、動的な引数を持つ関数を作成する際に問題があります。 はをコンパイルした(で渡された関数を取り、一度に一つの引数を適用する)F#の動的関数
let mapN<'output> (f : obj) args =
let rec mapN' (state:obj) (args' : (obj option) list) =
match args' with
| Some x :: xs -> mapN' ((state :?> obj -> obj) x) xs
| None _ :: _ -> None
| [] -> state :?> 'output option
mapN' f args
let toObjOption (x : #obj option) =
Option.map (fun x -> x :> obj) x
let a = Some 5
let b = Some "hi"
let c = Some true
let ans = mapN<string> (fun x y z -> sprintf "%i %s %A" x y z) [a |> toObjOption; b |> toObjOption; c |> toObjOption]
が、その後、実行時に、私は以下のようになります:私が試した
System.InvalidCastException: Unable to cast object of type '[email protected]' to type
'Microsoft.FSharp.Core.FSharpFunc`2[System.Object,System.Object]'.
私が実現しますオプションの計算式を作成するか、map2
からmap5
までを定義するのはもっと慣れていると思いますが、特にF#の動的機能を調べてこのようなことが可能かどうかを確認したいと考えています。
これはF#では実行できない概念ですか、それとも私が逃しているアプローチですか?
私のソリューションが動作しない理由とそれを動作させる方法の説明に感謝します。私は、ダイナミックなソリューションはかなり粗く、生産には適していないことに同意します。 F#の意見が変わったわけではありませんが、私はそこにある機能が不思議でした。 –