5 Stimmen

F#-Wert-Beschränkung

Ich habe alle Treads über Wertbeschränkung in F# gelesen, aber ich verstehe es immer noch nicht. Ich habe den folgenden Code:

type tree<'a> = 
    | Nil
    | Node of (tree<'a> * 'a * tree<'a>)

let rec flatten = function
    | Nil -> []
    | Node ( Nil, b, Nil ) -> [b]
    | Node ( l, h, p ) -> List.concat [(flatten l);[h];(flatten p)]

und der Compiler zeigt einen Fehler an:

error FS0030: Value restriction. The value 'it' has been inferred to have generic type
    val it : '_a list    
Either define 'it' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation.

Kann mir jemand helfen? Ich danke Ihnen vielmals;)

11voto

kvb Punkte 54045

Erlauben Sie mir, meine hellseherischen Fähigkeiten zur Fehlersuche einzusetzen. Sie können nicht anrufen flatten Nil denn, wie der Compiler angibt, könnte das Ergebnis ein 'a list für jeden Typ 'a . Sie müssen eine Typ-Anmerkung hinzufügen, wie z. B. (flatten Nil : int list) .

Unabhängig davon ist der zweite Fall in der Definition von "flatten" unnötig und kann entfernt werden, da er auch durch den dritten Fall abgedeckt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X