Actualización de FParsec: actualizar los sindicatos discriminados para satisfacer las nuevas restricciones de igualdad / comparación

StackOverflow https://stackoverflow.com/questions/2290103

Pregunta

Así que, por un hola lar ious serie de acontecimientos , he descargado la fuente FParsec y trató de construirlo. Por desgracia, no es compatible con el nuevo 1.9.9.9. He arreglado los problemas fáciles, pero hay un par de uniones discriminadas que aún no funcionan.?

Específicamente, después de Don Syme explica que los sindicatos discriminados que contienen elementos de obj tipo o -> no reciben automáticamente la igualdad o de comparación limitaciones, ya que los objetos no admiten comparación y funciones no son compatibles con la igualdad sea . (No está claro si la igualdad se genera automáticamente / buggy de comparación era antes, pero el código no se compilará incluso ahora que ya no son generados.)

Estos son algunos ejemplos de las UD problemática:

type PrecedenceParserOp<'a,'u'> =
     | PrefixOp of string * Parser<unit,'u> * int * bool * ('a -> 'a)
     | others ...

type ErrorMessage =
     | ...
     | OtherError of obj
     | ...

A continuación se utiliza el infractor:

member t.RemoveOperator (op: PrecedenceParserOp<'a, 'u>) =
    // some code ...
    if top.OriginalOp <> op then false // requires equality constraint
    // etc etc ...

o, para la restricción comparación

let rec printMessages (pos: Pos) (msgs: ErrorMessage list) ind =
    // other code ...
    for msg in Set.ofList msgs do // iterate over ordered unique messages
        // etc etc ...

Por lo que puedo decir, solución de etiquetar cada instancia con un int única de don es la manera correcta de poner en práctica una restricción de igualdad de encargo / comparación (o tal vez una única tupla int modo que las ramas individuales del DU se pueden pedir) . Pero esto es un inconveniente para el usuario del DU. Ahora, la construcción del DU requiere llamar a una función para obtener el siguiente sello.

¿Hay alguna manera de ocultar la etiqueta-obtener y presentar los mismos constructores a los usuarios de la biblioteca? Es decir, para cambiar la implementación sin cambiar la interfaz? Esto es especialmente importante, ya que parece (por lo que entiendo del código) que PrecedenceParserOp es un tipo de público.

¿Fue útil?

Solución

qué fuente se descarga para FParsec? Me agarró la última de la FParsec BitBucket repositorio, y que no tiene que realizar ningún cambio en el todos a la fuente FParsec a que se compile en VS 2010 RC.

Editar: retiro lo dicho. Yo tuve errores de compilación de los proyectos de la muestra InterpLexYacc y InterpFParsec, pero los proyectos básicos y FParsec FParsecCS construir muy bien.

Otros consejos

Una cosa que podría hacer es añadir atributos [<CustomEquality>] y [<CustomComparison>] y definir su propia anulación .Equals y IComparable aplicación. Por supuesto, esto requeriría que para manejar los componentes obj y _ -> _ a sí mismo de una manera apropiada, que puede o no puede ser posible. Si usted puede controlar lo que está siendo pasado al constructor OtherError, usted debería ser capaz de hacer este trabajo para el tipo ErrorMessage por downcasting la obj a un tipo que a su vez es estructuralmente similar. Sin embargo, el caso PrecendenceParserOp es un poco más complicado. - es posible que pueda pasar con el uso de la igualdad de referencia sobre los componentes de la función, siempre y cuando no es necesario comparación, así

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