В F # оператор равенства (=) обычно является экстенсиональным, а не интенсиональным. Замечательно! К сожалению, мне кажется, что F # не использует равенство указателей для сокращения этих расширенных сравнений.
Например, этот код:
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)
... дает мне большую ошибку сегментации жира [*], несмотря на то, что 'a' и 'a' оба оценивают одну и ту же ссылку. Это не так здорово. Другие функциональные языки (например, схема PLT) получают это право, используя консервативное сравнение указателей, чтобы возвращать «истину», когда это можно определить с помощью сравнения указателей.
Итак: я приму тот факт, что оператор равенства F # не использует сокращения; Есть ли способ выполнить интенсиональную (основанную на указателе) проверку на равенство? Оператор (==) не определен в моих типах, и я хотел бы, чтобы кто-нибудь сказал мне, что он каким-то образом доступен.
Или скажите мне, что я не прав в моем анализе ситуации: я тоже это полюбил бы ...
[*] Это может быть переполнение стека в Windows; В Моно есть вещи, которые мне не нравятся ...