Ich versuche die dynamischen Fähigkeiten von F # für Situationen zu erforschen, in denen ich mit dem statischen System keine Funktion ausdrücken kann. Als solcher versuche ich eine mapN
Funktion für (sagen wir) Option
Typen, aber ich habe Probleme beim Erstellen einer Funktion mit einer dynamischen Anzahl von Argumenten. Ich habe versucht:Dynamische Funktionen in 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]
(die die Funktion übergab und wenden ein Argument zu einem Zeitpunkt) die kompilieren, aber dann zur Laufzeit erhalte ich folgende:
System.InvalidCastException: Unable to cast object of type '[email protected]' to type
'Microsoft.FSharp.Core.FSharpFunc`2[System.Object,System.Object]'.
Ich weiß, dass es idiomatischer wäre, entweder einen Berechnungsausdruck für Optionen zu erstellen oder map2
bis map5
oder so zu definieren, aber ich möchte speziell die dynamischen Fähigkeiten von F # untersuchen, um zu sehen, ob so etwas möglich wäre.
Ist dies nur ein Konzept, das in F # nicht möglich ist, oder gibt es einen Ansatz, den ich vermisse?
danke für die Erklärung, warum meine Lösung nicht funktioniert und wie man es zur Arbeit bringt. Ich stimme zu, dass die dynamische Lösung ziemlich grob und nicht für die Produktion geeignet ist. Nicht das ändert meine Meinung zu F #, ich war nur neugierig auf die Fähigkeiten dort. –