Domanda

Non sono sicuro se i modelli attivi non statico membri pubblici sono ammessi, ma si possono definire senza il compilatore lamentarsi. Se essi sono autorizzati qual è la sintassi per la corrispondenza con uno? Il compilatore mi sta dando una mancata corrispondenza tipo per Foo in FooBar2.doSomething. In attesa di un determinato 'a -> Choice<'b,'c> 'a -> 'd -> Choice<unit,unit>

// No error in this class, static works great
type FooBar() = 
    static member (|Foo|Bar|) (x, y) =
        match x = y with
        | true -> Foo
        | false -> Bar

    member x.doSomething y =
        match x, y with
        | Foo -> ()
        | Bar -> ()

type FooBar2() = 
    member x.(|Foo|Bar|) y =
        match x = y with
        | true -> Foo
        | false -> Bar

    // compiler error on "Foo"    
    member x.doSomething y =
        match y with
        | Foo -> ()
        | Bar -> ()
È stato utile?

Soluzione

modelli attivi non devono essere utilizzati come membri. Il fatto che questi compilare a tutti è un bug del compilatore che ci fissiamo (grazie per il report :)). Uso locale o modulo-bound "let" s per definire un modello attivo.

Altri suggerimenti

Non sono sorpreso che questo non funziona, e non riesco a vedere un'interpretazione semantica naturale per esempio i modelli attivi. Come fai a sapere quale istanza da utilizzare quando si vede il modello Foo? Potrebbe avere istanze diverse per i casi Foo e Bar (e quindi delle partite modello incompleto)? Non sembra essere un elegante soluzione delle questioni qui. Per essere onesti, io sono sorpreso che anche il caso statico funziona, e non vedo nulla nelle specifiche affrontare la definizione di modelli attivi come membri di qualsiasi tipo.

riconoscitori Stati sembrano essere fuori dalla versione 1.9.9.9. anche per i membri statici. Penso che sia un peccato perché ha permesso di riconoscitore sovraccarico. Ho potuto avere un riconoscitore 'Nome' per il tipo, MemberInfo ecc Ora ho bisogno di avere un 'nome_tipo'. 'MEMBER_NAME' ecc per evitare conflitti. Basta 'Nome' era più bello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top