In F #, l'operatore di uguaglianza (=) è generalmente estensionale, piuttosto che intensionale. È fantastico! Sfortunatamente, mi sembra che F # non usi l'uguaglianza tra puntatori per abbreviare questi confronti estensionali.controllo di uguaglianza breve in F #?
Per esempio, questo codice:
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)
... mi dà un grosso errore di grasso di segmentazione [*], nonostante il fatto che 'a' e 'un' sia restituiscono lo stesso riferimento. Non è così bello. Altri linguaggi funzionali (ad esempio lo schema PLT) ottengono questo diritto, utilizzando i confronti dei puntatori in modo conservativo, per restituire 'true' quando può essere determinato utilizzando un confronto tra puntatori.
Quindi: accetto il fatto che l'operatore di uguaglianza di F # non usi il taglio corto; c'è un modo per eseguire un controllo di uguaglianza intensionale (basato sul puntatore)? L'operatore (==) non è definito sui miei tipi e mi piacerebbe se qualcuno potesse dirmi che è disponibile in qualche modo.
O dirmi che ho sbagliato nella mia analisi della situazione: Mi piacerebbe che, anche ...
[*], che sarebbe probabilmente un overflow dello stack su Windows; ci sono cose su Mono che non mi piacciono molto ...
Grazie! Per inciso: sì, questo in realtà esegue il dump di core su mono/osx. Forse il tail-calling non è implementato correttamente per il controllo di uguaglianza nella particolare combinazione di mono/fsharp che sto usando. –