我不完全理解为什么它工作得很好:
[9223372036854775809..9223372036854775815] :: [Integer]
这些是大于 maxBound :: Int
的整数。然而,这些是两个关键 Enum
的类型签名功能:
toEnum :: Int -> a
fromEnum :: a -> Int
如您所见,他们有 Int
,这是有界的。
那么为什么上面的方法有效呢?
澄清:
我的问题的重点是:不是 enumFromTo
定义为toEnum
和fromEnum
?因为这两个只能正常工作 Int
s,怎么能enumFromTo
(其中 ..
是语法糖)适用于 Integer
是吗?
最佳答案
enumFromTo
for Integer
不是根据 toEnum
和 fromEnum
定义的,这确实会造成损失正如你提到的那样。您可以阅读implementation here ,它调用 enumDeltaToInteger::Integer -> Integer -> Integer -> [Integer]
。
instance Enum Integer where
succ x = x + 1
pred x = x - 1
toEnum (I# n) = smallInteger n
fromEnum n = I# (integerToInt n)
{-# INLINE enumFrom #-}
{-# INLINE enumFromThen #-}
{-# INLINE enumFromTo #-}
{-# INLINE enumFromThenTo #-}
enumFrom x = enumDeltaInteger x 1
enumFromThen x y = enumDeltaInteger x (y-x)
enumFromTo x lim = enumDeltaToInteger x 1 lim
enumFromThenTo x y lim = enumDeltaToInteger x (y-x) lim
关于haskell - Integer 如何拥有 Enum 的实例? toEnum和fromEnum仅使用Int,这是有限的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35119428/