http://learnyouahaskell.com/functors-applicative-functors-and-monoids:
Product
определяется следующим образом:
newtype Product a = Product { getProduct :: a }
deriving (Eq, Ord, Read, Show, Bounded)
Почему Product
вынужден быть Bounded
?
Из той же книги, несколько абзацев ниже:
Его экземпляр для Monoid
выглядит примерно так:
instance Num a => Monoid (Product a) where
mempty = Product 1
Product x `mappend` Product y = Product (x * y)
А?Единственное ограничение - Num a
!Но Num
в частности означает Integer
, и это не ограничено (в отличие от Int
), AFAIK.
Давайте проверим это тогда:
import Data.Monoid
numbers :: [Integer]
numbers = [1..100]
main = print (getProduct . mconcat . map Product $ numbers)
Давайте посмотрим этот код вдействие:
m@m-X555LJ:~$ runhaskell wtf.hs
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
m@m-X555LJ:~$
Работает.Не терпит неудачу.
Так что же значит Product
?Есть ли граница Product
?
Давайте играть снова:
m@m-X555LJ:~$ ghci
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Prelude> minBound :: Int
-9223372036854775808
Prelude> maxBound :: Int
9223372036854775807
Prelude> import Data.Monoid
Prelude Data.Monoid> maxBound :: (Product Integer)
<interactive>:4:1: error:
• No instance for (Bounded Integer)
arising from a use of ‘maxBound’
• In the expression: maxBound :: Product Integer
In an equation for ‘it’: it = maxBound :: Product Integer
Prelude Data.Monoid> maxBound :: Product
<interactive>:5:13: error:
• Expecting one more argument to ‘Product’
Expected a type, but ‘Product’ has kind ‘* -> *’
• In an expression type signature: Product
In the expression: maxBound :: Product
In an equation for ‘it’: it = maxBound :: Product
Prelude Data.Monoid> maxBound :: (Product Int)
Product {getProduct = 9223372036854775807}
Prelude Data.Monoid>
Leaving GHCi.
m@m-X555LJ:~$
Не похоже, что Product
само по себе Bounded
.Int
есть;но maxBound :: (Product Integer)
бросает!IIUC Product deriving Bounded
- это обещание, что maxBound
четко определено для Product
.Очевидно, не всегда.
Так почему Product
является экземпляром Bounded
?