Плавающие точки, обернутые в Sum и Product, даже если это нарушает ассоциативность?

Пытаясь выучить Haskell и наткнулся на это:

Prelude> import Data.Semigroup
Prelude Data.Semigroup> let x = Sum 0.1 <> Sum 0.2 <> Sum 0.3
Prelude Data.Semigroup> let y = (Sum 0.1 <> Sum 0.2) <> Sum 0.3
Prelude Data.Semigroup> x == y
False

Очевидно, что это нормальная неточность с арифметикой с плавающей запятой, но почему экземпляры значений с плавающей запятой Num или, возможно, почему есть экземпляр instance Num a => Semigroup (Sum a) если ассоциативность не имеет места? Существуют ли другие области, где гарантии системы типов не являются гарантиями, о которых следует знать? Помимо числовых значений фиксированной ширины?

0 ответов

Другие вопросы по тегам