#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:
Я обобщу расширенные комментарии. Возможные причины (до тех пор, пока не будет дан более авторитетный ответ):
- Согласованность с OCaml, из которого получен F # (если вы делаете что-то неправильное / ненужное, лучше продолжать это делать, чтобы люди знали, чего ожидать :-))
- Перегрузка (в основном для пользовательских типов)
- Симметрия с унарным отрицанием
Комментарии:
1. По тому же принципу мы должны добавить в язык унарный оператор «yes», чтобы сделать его симметричным с унарным оператором «not» (
!
). Мы могли бы дополнительно обосновать включение оператора «yes», потому что это было бы полезно, если кто-то захочет перегрузить его для своего собственного пользовательского типа.2.
!
это разыменование, а неnot
. У функции есть положительный аналогnot
, и он вызываетсяid
.3. @PeterOlson Я бы назвал это оператором «действительно». «Если действительно x равно трем …»
4. Я согласен с вами. Поскольку единственное его существенное использование, с которым я столкнулся, было в C, мне интересно, является ли это просто артефактом на большинстве языков.
5. Одним из вариантов использования для ваших точек 2 и 3 будут комплексные числа, где
i
выглядит как вполне естественный аналог-i
, даже если он действительно такой же, какi
.
Ответ №2:
F # имеет два основных влияния:
- OCaml, с которым он изначально был совместим, и
- среда 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. Это то, для чего он
~
предназначен. Это также говорит о том, что для~-
, так что это на самом деле не отвечает на мой вопрос.