pi
- это метод класса Floating
:
class Fractional a => Floating a where
pi :: a
...
Так что pi
является полиморфным, и разработчик экземпляра должен определить его соответствующим образом.
Наиболее распространенные экземпляры - это Float
и Double
, которые имеют ограниченную точность:
Prelude> pi :: Float
3.1415927
Prelude> pi :: Double
3.141592653589793
, но ничто не мешает вам использовать другие пакеты, такие как long-double
, который дает еще несколько битовнекоторые системы:
Numeric.LongDouble> pi :: LongDouble
3.1415926535897932385
или rounded
, которые дают произвольно много бит точности с помощью программной реализации MPFR:
Numeric.Rounded> pi :: Rounded TowardNearest 100
3.1415926535897932384626433832793
Numeric.Rounded> pi :: Rounded TowardNearest 500
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081283
Пакет numbers
обеспечивает реализацию на чистом Haskell:Конструктивные (точные) действительные числа, которые могут отображаться в любом количестве цифр:
Data.Number.CReal> showCReal 100 pi
"3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068"
Вы также можете иметь меньшую точность с пакетом half
, возможно, совместимым с GPU:
Numeric.Half> pi :: Half
3.140625
Когда вы оцениваете pi
без указания конкретного типа, вступают в действие правила по умолчанию интерпретатора.
Каждая переменная по умолчанию заменяется первым типом в списке по умолчанию, которыйявляется экземпляром всех классов неоднозначной переменной.... Если в модуле не задано объявление по умолчанию, то предполагается, что оно будет: default (Integer, Double)
- https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-790004.3.4
Prelude> :t pi
pi :: Floating a => a
Integer
не Floating
, а Double
есть, поэтому неоднозначный тип разрешается по умолчанию Double
.Вы можете получить больше информации, включив -Wtype-defaults
:
Prelude> :set -Wtype-defaults
Prelude> pi
<interactive>:2:1: warning: [-Wtype-defaults]
• Defaulting the following constraints to type ‘Double’
(Show a0) arising from a use of ‘print’ at <interactive>:2:1-2
(Floating a0) arising from a use of ‘it’ at <interactive>:2:1-2
• In a stmt of an interactive GHCi command: print it
3.141592653589793
(Примечание: я написал пакет long-double
и являюсь текущим сопровождающим rounded
.)