Можно ли определить собственные операторы в F#?

Существует ли способ определить Ваши собственные операторы в F#?

Раз так кто-то может дать мне пример для этого? Я искал кратко, но ничего не мог найти.

10
задан Joan Venge 5 February 2010 в 22:19
поделиться

1 ответ

Да:

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
29
ответ дан 3 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: