Существует ли способ определить Ваши собственные операторы в F#?
Раз так кто-то может дать мне пример для этого? Я искал кратко, но ничего не мог найти.
Да:
let (+.) x s = [for y in s -> x + y]
let s = 1 +. [2;3;4]
Символы, которые могут использоваться в операторе F #, перечислены в разделе 3.7 спецификации . Это !% & * + -. / <=> @ ^ | ~
и для любого символа после первого, ?
. Приоритет и фиксация определяются первым символом оператора (см. Спецификацию).
Вы можете создавать свои собственные операторы с привязкой к let, как я сделал выше, и в этом случае они работают так же, как функции с привязкой к let. Вы также можете определить их как члены типа:
type 'a Wrapper = Wrapper of 'a with
static member (+!)(Wrapper(x), Wrapper(y)) = Wrapper(x+y)
let w = (Wrapper 1) +! (Wrapper 2)
В этом случае вам не нужно заранее определять функцию let-bound для использования оператора; F # найдет это по типу. Вы можете особенно хорошо воспользоваться этим, используя встроенные определения:
let inline addSpecial a b = a +! b
let w2 = addSpecial w (Wrapper 3)
Если пойти дальше, вы можете сделать операторы ваших типов встроенными, чтобы вы могли использовать их в еще более широком спектре экземпляров вашего класса:
type 'a Wrapper = Wrapper of 'a with
static member inline (+!)(Wrapper(x), Wrapper(y)) = Wrapper(x+y)
let wi = (Wrapper 1) +! (Wrapper 2)
let wf = (Wrapper 1.0) +! (Wrapper 2.0)
let wi2 = addSpecial wi wi
let wf2 = addSpecial wf wf