Ich versuche, Computerausdrücke zu verwenden, um eine Builder-ähnliche DSL zu erstellen, aber wenn ich versuche, mit Zuweisungen zu helfen, Dinge zu komponieren, bekomme ich einen Kompilierungsfehler, der solche Zuordnungen kann nicht gefunden werden. Hier ein Beispiel:Kann Variablen innerhalb eines Berechnungsausdrucks nicht wiederverwenden
type Node =
{
Key: Option<string>
Children: List<Node>
XPathFromParent: string
}
let defaultNode =
{
Key = None;
Children = [];
XPathFromParent = ".//somePath"
}
type NodeBuilder(xpath: string) =
member self.Yield(item: 'a): Node = defaultNode
member this.xpath = xpath
[<CustomOperation("xpath_from_parent")>]
member __.XPathFromParent (node, x) = {node with XPathFromParent = x}
[<CustomOperation("nodes")>]
member __.Nodes (node, x) = {node with Children = x}
[<CustomOperation("key")>]
member __.MidasMeasurementKey (node, x) = {node with Key = x}
member this.Bind(x, f) = f x
let node xpath = NodeBuilder(xpath)
let rootNode = node ".//somePath" {
let! childNodes =
[
node "somepath" {
nodes []
};
node "someOtherPath" {
nodes []
}
]
nodes childNodes // The value or constructor 'childNodes' is not defined.
}
Wie kann ich diesen Code ändern, so dass ich die childNodes
Zuordnung verweisen kann es in den nodes
benutzerdefinierten Operator übergeben?
Hey @rmunn, du hast richtig geraten, dass ich neu bei F # bin :). Ich bin jedoch wirklich auf der Suche nach dem Einsatz von Berechnungsausdrücken. Ich versuche, eine Builder-DSL zu erstellen, die auch technisch nicht versierte Personen für ein unternehmensspezifisches Problem meines Unternehmens schreiben können - meiner Meinung nach ist die hypothetische Version mit Berechnungsausdrücken viel einfacher für die Augen. Wenn es nur für technische Leute nur wäre, würde ich tun, wie Sie klug vorgeschlagen haben. – nebffa
Dann kann ich dir nicht viel helfen: Ich kann dein Problem reproduzieren, aber es stopft mich auch. Der beste Vorschlag, den ich machen kann, ist 'printfn' Anweisungen zu sprengen, aka der Debugger des armen Mannes :-), in deinen Erbauer und sehen wann (und wenn) sie angerufen werden. – rmunn
Aber ein anderer Vorschlag, den ich habe, ist, wenn Sie eine DSL für Nicht-Techies bauen möchten, sind Berechnungsausdrücke möglicherweise nicht so gut wie das Rollen Ihrer eigenen kleinen Sprache mit [FParsec] (http://www.quantec.com/fparsec) /tutorial.html). Die Fehlermeldungen von Berechnungsausdrücken sind selbst für erfahrene Entwickler eher undurchsichtig; Nicht-Techniker werden es * unmöglich * finden, herauszufinden, dass sie (sagen wir) ein Wort ausgelassen haben (z.B., schrieb '[]', wenn sie 'nodes []' hätten schreiben sollen. Wenn Sie FParsec verwenden, um ihnen eine benutzerdefinierte Sprache zum Schreiben zu geben, können Sie die Syntax und die Fehlermeldungen steuern. – rmunn