2010-04-21 14 views
5

En F #, el operador de igualdad (=) es generalmente extensional, en lugar de intensional. ¡Eso es genial! Desafortunadamente, me parece que F # no usa la igualdad del puntero para acortar estas comparaciones extensionales.comprobación de igualdad de corte corto en F #?

Por ejemplo, este código:

 
type Z = MT | NMT of Z ref 

// create a Z: 
let a = ref MT 
// make it point to itself: 
a := NMT a 

// check to see whether it's equal to itself: 
printf "a = a: %A\n" (a = a) 

... me da un error de gran segmentación de grasa [*], a pesar del hecho de que 'a' y 'a' evaluar tanto a la misma referencia. Eso no es tan bueno. Otros lenguajes funcionales (por ejemplo, el esquema PLT) obtienen este derecho, usando comparaciones con punteros de forma conservadora, para devolver 'verdadero' cuando se puede determinar usando una comparación de puntero.

Entonces: voy a aceptar el hecho de que el operador de igualdad de F # no utiliza el acceso directo; ¿Hay alguna forma de realizar una verificación de igualdad intensional (basada en puntero)? El operador (==) no está definido en mis tipos, y me encantaría que alguien pudiera decirme que está disponible de alguna manera.

O dime que estoy equivocado en mi análisis de la situación: Me encanta que, también ...

[*] que probablemente sería un desbordamiento de pila en Windows; hay cosas sobre Mono que no me gustan mucho ...

Respuesta

7

Hay dos opciones que conozco. El enfoque estándar de .NET sería usar System.Object.ReferenceEquals. Un enfoque un poco mejor en F # podría ser usar LanguagePrimitives.PhysicalEquality que es básicamente idéntico, pero solo funciona en tipos de referencia (que probablemente sea correcto para sus propósitos) y requiere que ambos argumentos tengan el mismo tipo estático. También puede definir un operador personalizado de su elección en términos de cualquiera de estas funciones si desea una sintaxis más agradable.

Como un lado, en .NET obtengo un bucle infinito pero no un desbordamiento de pila cuando ejecuto el código, presumiblemente debido a la optimización de la cola de llamadas.

+0

Gracias! Como comentario aparte: sí, esto realmente hace volcar core en mono/osx. Tal vez las llamadas finales no se implementen correctamente para la comprobación de igualdad en la combinación particular de mono/fsharp que estoy usando. –

Cuestiones relacionadas