Почему "Int ^ Int" в Scala не является возведением в степень? (Что это?) - PullRequest
2 голосов
/ 11 марта 2012

^ всегда должен был означать возведение в степень. Но это не так. Что это на самом деле означает, и есть ли какие-либо функции-члены Int, которые имеют возведение в степень (кроме math.pow)?

И почему это так определено? Он получает приоритет оператора ниже, чем арифметические операции, когда все остальные языки дают ему наивысший приоритет.

Ответы [ 3 ]

22 голосов
/ 11 марта 2012

Ну, «все другие языки» - очень сильное утверждение.

'^' в Scala происходит от Java (откуда он происходит из общей близости языка C) и означает побитовое XOR.И он используется как XOR и в других языках, например.в Python.

20 голосов
/ 11 марта 2012

Это битовый эксклюзив или.Вы, вероятно, никогда не разрабатывали на C, C ++ или Java, или ... Это унаследовано от них.Я не знаю, как можно было бы определить, каким он «должен» быть, но определенно есть много кода, написанного с таким значением.

Int (и RichInt) не имеютоператор возведения в степень.

Что касается приоритета, он находится в середине других логических операторов, и именно там он принадлежит, учитывая его значение фактическое (в отличие от возведения в степень).

Если вы действительно хотите переопределить значение «^» в пределах ограниченной области (что я делаю , а не , рекомендую), я думаю, вы могли бы сделать это, используя неявные параметры,тем самым получая высокий приоритет, который вы хотите.Или, что более разумно, я думаю, вы могли бы определить оператор «to_the» или «**» таким же образом, получив тот же высокий приоритет.

0 голосов
/ 16 октября 2013

Многие языки имеют операторы возведения в степень: R, Matlab, BASIC, LaTeX и UNIX для bc используют '3 ^ 2', Ada, COBOL, PL / I, Python и Fortran используют '3 ** 2'.

Я видел, что утверждалось, что возведение в степень является относительно редким, но я скажу, что за многие годы программирования мне никогда не требовался XOR, и прошло много лет с тех пор, как я нуждался в каких-либо битовых операциях ввсе - вероятно, в те времена, когда они измеряли RAM в килобайтах.С другой стороны, я делаю возведение в степень довольно часто.

Мне кажется, что если бы я собирался использовать Scala в качестве моего R, я мог бы рассмотреть что-то вроде:

implicit class FixPow(x: Double) { def ~^(p: Double): Double = Math.pow(x, p) }

, что являетсянемного некрасиво, но имеет более высокий приоритет, чем '*', что и нужно.Таким образом, '3 * 2 ~ ^ 3' оценивается как 24, как и ожидалось.

Поддержка Си для полного набора битовых операций происходит из-за того факта, что UNIX был написан на C. Он по существу кодифицировал шаблоны на ассемблере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...