Aktives Muster in F # 3.0

8

Dieses aktive Muster wird mit F # 2.0 kompiliert:

%Vor%

, aber in F # 3.0, gibt den Fehler aus:

  

Aktives Muster '| Wert | _ |' hat einen Ergebnistyp, der Typvariablen enthält, die nicht von der Eingabe bestimmt werden. Die gemeinsame Ursache ist, wenn ein Ergebnisfall nicht erwähnt wird, z. 'let (| A | B |) (x: int) = A x'. Dies kann mit einer Typbeschränkung, z.B. 'let (| A | B |) (x: int): Auswahl = A x'

Ich habe es versucht:

%Vor%

und:

%Vor%

Wie kann es behoben werden?

Umgebungen: Visual Studio 2012 (RTM) und FSI v11.0.50727.1

EDIT: Hier ist eine einfachere Repro:

%Vor%     
Daniel 15.08.2012, 22:26
quelle

4 Antworten

4

Es gab einen Fehler im F # 2.0-Compiler, bei dem der Compiler eine falsche Analyse und eine fehlerhafte Codegenerierung für bestimmte aktive Muster mit freien Typvariablen im Ergebnis vornahm; eine einfache Repro ist

%Vor%

erzeugt eine merkwürdige Warnung zur Kompilierungszeit und kompiliert in scheinbar falschen Code. Ich schätze, dass unser Versuch, diesen Fehler zu beheben (und einige verrückte Fälle einzuschränken) in F # 3.0 auch einige Rechtskodes als Kollateralschäden des Updates durchbrochen hat.

Ich werde einen weiteren Fehler einreichen, aber für F # 3.0 klingt es so, als müssten Sie eine der in anderen Antworten erwähnten Problemumgehungen verwenden.

    
Brian 16.08.2012, 16:51
quelle
3

Ich habe die neue Version noch nicht installiert, aber ich stimme zu, das sieht ein bisschen faul aus. Ich denke, es gibt vielleicht einen guten Grund für diese Einschränkung, aber Ihr Beispiel in der anderen Frage scheint ziemlich zwingend.

Zur Problemumgehung denke ich, dass das Hinzufügen eines Zeugenparameters (der nicht verwendet wird, aber angibt, wie der Typ des Ergebnisses aussieht) funktioniert:

%Vor%

Das macht natürlich den Gebrauch ein bisschen hässlicher, weil Sie ein Argument haben müssen. In obigem habe ich Zeuge des Typs unit -> 'T verwendet, in der Hoffnung, dass das Folgende kompilieren könnte:

%Vor%

Wenn das nicht funktioniert, können Sie wahrscheinlich versuchen, einen Zeugenparameter vom Typ 'T zu verwenden (aber dann müssen Sie eine tatsächliche Funktion und nicht nur eine generische Funktion bereitstellen).

    
Tomas Petricek 16.08.2012 15:12
quelle
2

der Vollständigkeit halber noch eine Umgehungsmöglichkeit:

%Vor%

Es wird jedoch immer noch unter dem Problem leiden, das von @ kvb in einem anderen Thread . Persönlich bevorzuge ich @ Kvb-Version mit parametrisierten aktiven Muster.

    
desco 16.08.2012 23:25
quelle
0

Siehe meine Antwort zu Ihrem anderen Frage für einige Gedanken darüber, wie man das Problem umgehen kann und ein Grund, warum solche aktiven Muster unerwünscht sein könnten. Ich bin mir nicht sicher, ob die brechende Veränderung beabsichtigt war.

    
kvb 16.08.2012 15:38
quelle