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 ...
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. –