Почему Haskell может обработать очень большие количества легко?

замена Метода для экземпляра объекта

можно заменить методы уже экземпляров созданного объекта. Это позволяет Вам создавать экземпляр объекта с различной (исключительной) функциональностью:

>>> class C(object):
...     def fun(self):
...         print "C.a", self
...
>>> inst = C()
>>> inst.fun()  # C.a method is executed
C.a <__main__.C object at 0x00AE74D0>
>>> instancemethod = type(C.fun)
>>>
>>> def fun2(self):
...     print "fun2", self
...
>>> inst.fun = instancemethod(fun2, inst, C)  # Now we are replace C.a by fun2
>>> inst.fun()  # ... and fun2 is executed
fun2 <__main__.C object at 0x00AE74D0>

, Как мы можем C.a, был заменен fun2() в inst экземпляр (self, не изменился).

, Кроме того, мы можем использовать new модуль, но он обесценивается начиная с Python 2.6:

>>> def fun3(self):
...     print "fun3", self
...
>>> import new
>>> inst.fun = new.instancemethod(fun3, inst, C)
>>> inst.fun()
fun3 <__main__.C object at 0x00AE74D0>

Узел: Это решение не должно использоваться в качестве общей замены механизма наследования! Но это может быть очень удобно в некоторых определенных ситуациях (отладка, дразня).

Предупреждение: Это решение не будет работать на встроенные типы и на модернизированные слоты использования классов.

26
задан Eric 26 July 2009 в 17:28
поделиться

8 ответов

Java имеет класс BigInteger .

Он мог бы встроить это средство в язык, но (как и многие другие языки) он имеет тенденцию приближать примитивные функции к карте на вещи, которые поддерживаются ЦП.

Haskell, с другой стороны, подчеркивает выразительность в стиле математической записи, где соображения «производительности» в значительной степени не имеют значения.

26
ответ дан 28 November 2019 в 06:10
поделиться

Ну, вы можете переопределить фиксированный набор операторов на многих языках, например C ++ или C # . Другие, такие как F # или Scala , позволяют определять даже новые операторы (даже как инфиксные), которые могут быть еще лучше для математических вещей.

Так же, как числовые литералы, многие операторы также перегружены (с использованием классов типов ), и поэтому могут использоваться с различными типами. Таким образом, оператор + может работать как с Int , так и с Float s.

В вашем случае, поскольку вы не предоставили никакой информации о типе, интерпретатор по умолчанию будет использовать тип Целое число . Это означает, что для оператора ^ он также выберет экземпляр Integer . С учетом целочисленных вычислений произвольной точности.

Если вы не предоставите любую информацию о типе, интерпретатор по умолчанию будет использовать тип Integer . Это означает, что для оператора ^ он также выберет экземпляр Integer . С учетом целочисленных вычислений произвольной точности.

Если вы не предоставите любую информацию о типе, интерпретатор по умолчанию будет использовать тип Integer . Это означает, что для оператора ^ он также выберет экземпляр Integer . С учетом целочисленных вычислений произвольной точности.

11
ответ дан 28 November 2019 в 06:10
поделиться

Это различие в философии дизайна ]:

  • Разработчики Haskell хотели быть уверены, что пользователи не будут удивлены кажущимся произвольным отказом целочисленных вычислений, требующих более 32 битов.

  • Разработчики Java хотели быть уверены, что пользователи этого не сделают. удивлен кажущейся произвольной деградацией производительности, вызванной выполнением большого количества вычислений над целыми числами, требующими более 32 бит.

В каждом языке вы должны делать что-то особенное, чтобы получить другое целое число.

Там длинный, благородная история языков, по умолчанию поддерживающих сколь угодно большие целые числа. Два из моих любимых - это Icon и Smalltalk , которым больше 25 лет.

42
ответ дан 28 November 2019 в 06:10
поделиться

Как уже упоминалось, если у вас есть 32-битные слова и вы используете полный диапазон, вы получите от -2 ^ 31 до 2 ^ 31-1 с использованием дополнения до двух.

Зарезервировав несколько битов слова, эти биты могут использоваться для переноса информации о типе значения. То есть значения «знают» свой собственный тип во время выполнения. Остальные биты используются для передачи данных значения.

Целочисленные значения, которые соответствуют этим оставшимся битам, могут быть сохранены непосредственно в слове. Такие целые числа обычно называют фиксированными числами. Если они не подходят, то биты типа слова указывают, что это 'bigint', а оставшиеся биты используются для хранения указателя памяти в куче, где хранится значение bigint.

Компилятор должен преобразуйте арифметические выражения в несколько путей кода, которые охватывают допустимые комбинации типов для операндов. Пример для добавления:

  • fixnum + fixnum
  • bigint + fixnum
  • fixnum + bigint
  • bigint + bigint

Многие оптимизации в компиляторах для этих языков сосредоточены на том, чтобы избежать накладных расходов на проверку типов во время выполнения. необходимо, чтобы эта работа. Часто также есть способы явно указать компилятору, что автоматическое понижение роли с fixnum до bignum нежелательно, и вместо этого требуется поведение переполнения 32-битных целых чисел. Это может быть очень важно для эффективной реализации алгоритмов криптографии.

Часто также есть способы явно указать компилятору, что автоматическое понижение роли с fixnum до bignum нежелательно, и вместо этого требуется поведение переполнения 32-битных целых чисел. Это может быть очень важно для эффективной реализации алгоритмов криптографии.

Также часто есть способы явно указать компилятору, что автоматическое понижение роли с fixnum до bignum нежелательно, и вместо этого требуется поведение переполнения 32-битных целых чисел. Это может быть очень важно для эффективной реализации алгоритмов криптографии.

1
ответ дан 28 November 2019 в 06:10
поделиться

Java has the notion of "Primitive Data Types" (which are the types that the processor supports) and those are different from all other Classes.

In Haskell, Int is a type like all other types, and therefore it was easily made a member of the Num and Integral typeclasses used in (^) ("(^) :: (Num a, Integral b) => a -> b -> a"). Another member of those typeclasses is Integer, which supports integers of all sizes (as long as you have enough memory for their digits).

In Java, you can use many "Big Numbers" libraries, but the operations for them won't use the infix operators you are used to, because those are only for "Primitive Types" in Java.

6
ответ дан 28 November 2019 в 06:10
поделиться

The short and basic answer is that they implement default integers differents. In Java, a standard int is 32 bits. Signed, that gives you a range of −2,147,483,648 to +2,147,483,647.

That said, Java has bignum classes too. If you use those, you'll also gain the ability to use arbitrarily large numbers.

3
ответ дан 28 November 2019 в 06:10
поделиться

Это вопрос того, как кодировать числа. Традиционный способ сделать это - закодировать числа с заданным числом битов, при котором вы не можете иметь бесконечную точность. Haskell, по-видимому, делает это с переменным количеством бит для числа, что тоже нормально, но обычно означает, что все вычисления выполняются программно, поскольку аппаратное ускорение обычно доступно только для конечной точности.

0
ответ дан 28 November 2019 в 06:10
поделиться

You can use BigInteger to do the same thing. Haskell is a functional language which is more terse than Java.

One reason we have so many languages is that different languages are better at different tasks as they were designed with different assumptions. Most functional languages are simpler with mathematical functions but tend to struggle with other use cases e.g. haskell is unlikely to be good choice for writing a GUI.

0
ответ дан 28 November 2019 в 06:10
поделиться
Другие вопросы по тегам:

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