Ich arbeite seit ein paar Monaten mit F #, fand aber keine zufriedenstellende Lösung für mein Problem. Ich möchte eine Folge von Operationen als eine diskriminierte Vereinigung von Werten oder Operationen an diesen Werten beschreiben. Auf diese Weise mein Typ Val < ‚o> wird wie folgt definiert:F # generische Constraint Union Typ
type Val<'o> =
| Val of 'o
| Func1 of ('a->'o) * Val<'a>
| Func2 of ('a->'b->'o) * Val<'a> * Val<'b>
Der Typ Val <‘ o> kann die Liste von rekursiv Anwendung aller Operationen und immer noch hält in einen ‚O-Typen umgewandelt werden von Operationen.
Aber ich kann die generischen Typen 'a und' b und ihre Nebenbedingungen nicht definieren, wenn ich Val < 'a,' b, 'o> nicht verwende. Wenn ich das tue, muss ich die Unter Val generische Typen definieren, die ich generic bleiben wollen:
type Val<'a, 'b, 'o> =
| Val of 'o
| Func1 of ('a->'o) * Val<?, ?, 'a>
| Func2 of ('a->'b->'o) * Val<?, ?, 'a> * Val<?, ?, 'b>
Gibt es eine F # Struktur, die für dieses Problem angepasst werden könnte?
Vielen Dank
[Bearbeiten]
Zu meinem Problem weiter zu beschreiben, ich versuche, eine erschöpfende Darstellung einer FRP-Struktur zu erhalten (aber das Genericity Problem ist das gleiche für Ereignisse/Signale, die für Werte).
Die Darstellung könnte entweder serialisierten für die Speicherung in Datenbanken, übersetzt in Text für die Anzeige und Benutzer bearbeiten oder ausgewertet werden um ein Ergebnis zu erhalten:
"Func (x -> x²) (Val(3.4))" <--> representation <--> 11.56
|
user
ich ganz gut einen Prototyp hergestellt arbeiten mit einem PrimitiveValue
Union-Typ, und Funktionen Strings kompiliert zur Laufzeit in generische obj[] -> obj
Funktionen, aber die Auswertung ist sehr schwer auf Typprüfung und Casting (vor allem, weil ich auch Arrays und Optionen in PrimitiveValue
), also suchte ich nach einer eleganten und stark typisierten Lösung.
Beachten Sie, dass Sie möglicherweise auch eine zweite "Invoke" -Überladung verwenden möchten, um 'Einheit'-wiederkehrende Operationen zu ermöglichen. – kvb
Beachten Sie auch, dass das Wickeln von ''T1 ->' T2 'durch eine andere Anwendung von' Val <_>' in 'IFuncOperation <_,_>' es Ihnen ermöglicht, Funktionen beliebiger Curry-Art auf eine entsprechende Anzahl von 'Val <_>'s auf eine nette Weise anzuwenden. – kvb