Pregunta

No estoy seguro de si se permite que los patrones activos miembro públicas no estático, pero se puede definir sin el compilador las protestas. Si se les permite lo que es la sintaxis para el juego contra uno? El compilador me da una coincidencia de tipos de Foo en FooBar2.doSomething. Esperando un 'a -> Choice<'b,'c> dado '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 -> ()
¿Fue útil?

Solución

Los patrones de activos no deben ser utilizados como miembros. El hecho de que estos compilan en todo es un error de compilador que vamos a arreglar (gracias por el informe :)). El uso local o módulo de ruedas "let" s para definir un patrón activo.

Otros consejos

No me sorprende que esto no funciona, y no puedo ver una interpretación semántica natural para los patrones activos de instancia. ¿Cómo se sabe qué instancia a utilizar cuando se ve el patrón de Foo? ¿Podría tener diferentes casos para los casos Foo y Bar (y por tanto un ajuste de patrones incompletos)? No parece ser una resolución de elegante a los problemas aquí. Para ser honesto, estoy sorprendido de que incluso el caso estático funciona, y yo no veo nada en la especificación abordar la definición de patrones activos como miembros de ningún tipo.

reconocedores miembros parecen estar fuera desde la versión 1.9.9.9. incluso para los miembros estáticos. Creo que es una lástima, porque permite la sobrecarga reconocedor. Podría tener un reconocedor de 'Nombre' para el Tipo, MemberInfo etc. Ahora tengo que tener un 'TYPE_NAME'. 'MEMBER_NAME', etc., para evitar conflictos de nombres. Sólo 'Nombre' era mejor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top