Почему в F # есть унарный оператор plus?

#f# #unary-operator

#f# #унарный оператор

Вопрос:

Некоторые языки используют унарный оператор plus для неявных преобразований, таких как преобразование строки в число (например, Javascript) или преобразование типов с малым числом в an int (например, большинство языков на основе C), или для использования при перегрузке операторов.

Поскольку унарный плюс в основном используется для хакерских целей, подобных этому, а также поскольку F # не выполняет автоматические расширяющие преобразования, я был удивлен, что F # включает унарный плюс.

Что добавляет к моему удивлению, так это то, что в Haskell нет унарного оператора plus. Поскольку на дизайн F # повлиял Haskell, мне любопытно, почему было решено, что F # нужен унарный плюс, когда Haskell, по-видимому, этого не сделал.

Можете ли вы привести пример надежного использования унарного плюса в F #? Если вы не можете, почему он вообще включен в язык?

Комментарии:

1. В Ocaml есть унарный оператор plus с именем (~ ) . Я тоже не знаю, для чего это нужно.

2. Я думаю, что он есть во всех языках, и ни один из них его не использует. Это для симметрии.

3. 1 — это не ((~ ) 1), а фактически число 1 (оно разрешается лексером). (1) ВОЗВРАТ -1 .

4. @PeterOlson: caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html -> Целочисленная арифметика

5. F # основан на OCaml и зависит только от Haskell. Если он есть в OCaml, вполне разумно, что он будет у F #.

Ответ №1:

Я обобщу расширенные комментарии. Возможные причины (до тех пор, пока не будет дан более авторитетный ответ):

  1. Согласованность с OCaml, из которого получен F # (если вы делаете что-то неправильное / ненужное, лучше продолжать это делать, чтобы люди знали, чего ожидать :-))
  2. Перегрузка (в основном для пользовательских типов)
  3. Симметрия с унарным отрицанием

Комментарии:

1. По тому же принципу мы должны добавить в язык унарный оператор «yes», чтобы сделать его симметричным с унарным оператором «not» ( ! ). Мы могли бы дополнительно обосновать включение оператора «yes», потому что это было бы полезно, если кто-то захочет перегрузить его для своего собственного пользовательского типа.

2. ! это разыменование, а не not . У функции есть положительный аналог not , и он вызывается id .

3. @PeterOlson Я бы назвал это оператором «действительно». «Если действительно x равно трем …»

4. Я согласен с вами. Поскольку единственное его существенное использование, с которым я столкнулся, было в C, мне интересно, является ли это просто артефактом на большинстве языков.

5. Одним из вариантов использования для ваших точек 2 и 3 будут комплексные числа, где i выглядит как вполне естественный аналог -i , даже если он действительно такой же, как i .

Ответ №2:

F # имеет два основных влияния:

  1. OCaml, с которым он изначально был совместим, и
  2. среда CLR, на которой она построена.

Как уже указывалось, в OCaml есть унарный оператор plus, поэтому с этой точки зрения для F # было естественно иметь его.

Что касается CLR… К моему удивлению, спецификация Common Language не определяет никаких требований к языкам для поддержки перегрузки операторов. Однако он определяет семантику и соглашения об именовании при использовании механизма. Тем не менее, F # было разрешено отказаться от использования унарного plus, точно так же, как C # и VB отказались от поддержки перегрузки составных операторов присваивания ( = и т.д.).

Самый распространенный .Сетевые языки, кроме F # (C #, VB и C / CLI), допускают это и имеют унарный плюс. Итак, с этой точки зрения также было бы естественно, чтобы F # поддерживал унарный оператор plus.

Комментарии:

1. » точно так же, как C # и VB отказались от поддержки составного присваивания «, C # поддерживает составные операторы присваивания. ;-]

2. Да, но они не соответствуют спецификации CLI. Если вы определяете = оператор в C / CLI, использование = в C # не вызовет его. В F # это будет.

Ответ №3:

В стандартной математической записи есть унарный оператор плюс. Большинство языков программирования имеют стандартную математическую нотацию в качестве исходного влияния и мотивации для синтаксиса арифметических выражений.

Ответ №4:

Согласно this «Используется для объявления перегрузки для унарного оператора plus».

Комментарии:

1. Это то, для чего он ~ предназначен. Это также говорит о том, что для ~- , так что это на самом деле не отвечает на мой вопрос.