#f#
#f#
Вопрос:
По-видимому, не существует логической версии побитового оператора исключающего или (^^^)
… что делать?
Ответ №1:
Это обеспечивается оператором not-equal <>
.
Комментарии:
1. Хорошо. Я в тупике. Как происходит
<>
замена логического xor?2.
<>
имеет значение True, когда входные данные разные, и False, когда входные данные одинаковы. Это именно то, что делает операция xor.3. Конечно! Я спросил это слишком поспешно. Заставляет задуматься, почему в C # это есть. В F # одно небольшое отличие, которое сделал бы оператор xor, заключается в том, что его операнды имеют тип bool .
4. Дой, да, это работает, спасибо. Но я вижу, что использование
<>
результатов в компиляторе F # выдает что-то вродеcall x; call y; ceq; ldc.i4.0; ceq
, в то время как компилятор C # будет выдаватьcall x; call y; xor
for^
… Интересно, есть ли там (микро) последствия для производительности.5. Можно выдать
xor
инструкцию, используя встроенный IL, но эта функция устарела, и они сказали нам, что намерены удалить ее в следующей версии:let inline xor (x:bool) (y:bool) = (# "xor" x y : bool #)
Ответ №2:
let inline xor a b = (a || b) amp;amp; not (a amp;amp; b)
Комментарии:
1. Почему встроенный, если известно, что тип bool ? Также почему нет
let xor a b = if a then not b else b
или дажеlet xor a b = a <> b
?