2014-05-01 2 views
5

Wenn ich diesen Code haben:Erstellen von rekursiven diskriminiert Gewerkschaften Werte

type HtmlNode = 
    | HtmlElement of name:string * attribute:HtmlAttribute list 
    | HtmlText of content:string 

and HtmlAttribute = 
    | HtmlAttribute of name:string * value:string * parent:HtmlNode 

let createElement name attrs = 
    let toAttributes element = [ for name, value in attrs -> HtmlAttribute(name, value, element)] 
    let rec element = HtmlElement(name, attributes) 
    and attributes = toAttributes element 
    element 

Der Compiler gibt den folgenden Fehler:

Recursive values cannot appear directly as a construction of the type 'HtmlNode' within a recursive binding. This feature has been removed from the F# language. Consider using a record instead.

Warum ist das so? Der Buchstabe rec soll die Erstellung von rekursiven Werten unterstützen, und etwas Ähnliches funktioniert mit Datensätzen.

+0

Ich bekomme damit keinen Fehler. – eulerfx

+0

Aufgrund der Nachricht wurde dies wahrscheinlich in der neuesten Version 3.1 geändert. – Daniel

+0

Der gleiche Fehler passiert in F # 3.0 - so ist es etwas älter –

Antwort

2

Ich weiß nicht, warum dies geändert wurde, aber eine Problemumgehung besteht darin, seq anstelle von list zu verwenden.

type HtmlNode = 
    | HtmlElement of name:string * attribute:HtmlAttribute seq 
    | HtmlText of content:string 

and HtmlAttribute = 
    | HtmlAttribute of name:string * value:string * parent:HtmlNode 

let createElement name attrs = 
    let rec element = HtmlElement(name, attributes) 
    and attributes = seq { for name, value in attrs -> HtmlAttribute(name, value, element) } 
    element 
+0

Interessant, wenn ich eine Liste oder ein Array an die Seq übergeben, stürzt es zur Laufzeit –

+0

Ich bemerkte, dass auch. Es scheint ein Grad an Indirektion erforderlich zu sein. – Daniel