Ich möchte einen DSL schaffen, in dem 2 (foo
und bar
) Funktionen nacheinander aufgerufen werden können, so dassWie eine typsichere DSL für verschachtelte Funktion erstellen, ruft
initialize()
|> foo 10
|> bar "A"
|> foo 20
|> bar "B"
|> transform
dies durch die Definition
ziemlich perfekt funktionierttype FooResult = FooResult
type BarResult = BarResult
let foo param (result_type:BarResult, result) = (FooResult, transform param result)
let bar param (result_type:FooResult, result) = (BarResult, transform param result)
Nun aber ich möchte auch, dass mehrere erlauben bar
Anrufe nacheinander ausgeführt werden können, jedoch foo
immer noch nur einmal aufgerufen werden müssen
initialize()
|> foo 10
|> bar "A"
//OK
|> bar "B"
|> transform
initialize()
|> foo 10
|> bar "A"
|> foo 20
//should yield an compile error
|> foo 30
|> bar "B"
|> transform
In C# konnte ich bar
überlasten, um entweder BarResult oder FooResult zu akzeptieren, aber das funktioniert nicht für F #. Zumindest nicht leicht. Ich habe auch versucht, einige diskriminierende Gewerkschaften zu schaffen, aber ich kann es wirklich nicht fassen.
wow! Ich muss zugeben, dass ich nicht an Schnittstellen gedacht habe - aber selbst wenn ich es getan hätte, hätte ich sicherlich keine solche Lösung gefunden. Denken Sie, dass auch eine Lösung mit diskriminierenden Verbindungen möglich wäre? – robkuz
Ich bin nicht sicher, dass DUs funktionieren würde - der Schlüsseltrick hier ist, die Vererbungsbeziehung zwischen Schnittstellen zu verwenden (wo zwei verschiedene Typen kompatibel sind). Ich denke, "Inline" und Überladung könnte eine Alternative sein. –
Nur noch eine Frage. Was bedeutet der Hash in 'MarkedValue <#IBarInput, _>'? – robkuz