haskell - Integer 如何拥有 Enum 的实例? toEnum和fromEnum仅使用Int,这是有限的

标签 haskell

我不完全理解为什么它工作得很好:

[9223372036854775809..9223372036854775815] :: [Integer]

这些是大于 maxBound :: Int 的整数。然而,这些是两个关键 Enum 的类型签名功能:

toEnum :: Int -> a
fromEnum :: a -> Int

如您所见,他们有 Int ,这是有界的。

那么为什么上面的方法有效呢?

澄清:

我的问题的重点是:不是 enumFromTo定义为toEnumfromEnum ?因为这两个只能正常工作 Int s,怎么能enumFromTo (其中 .. 是语法糖)适用于 Integer是吗?

最佳答案

enumFromTo for Integer 不是根据 toEnumfromEnum 定义的,这确实会造成损失正如你提到的那样。您可以阅读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/

相关文章:

haskell - 如何使用 Supply monad 创建一个生成全局唯一名称的函数?

haskell - 使用程序员 dvorak 键盘布局(移位数字)在 xmonad 中切换工作区

haskell - 1 :1 type/type-class-instance relation? 是否有可行且类型安全的替代方案

haskell - 如何编写更通用的 `Control.Monad.Writer.censor` 版本?

haskell - 如果在本地编译 Haskell,EC2 Ubuntu 12.04 会有所不同吗?

haskell - 我无法为我的 Forest 数据类型使用这个 Show/Functor 实例

haskell - withMVar和bracket_的行为不同

haskell - 如何使用镜头库编写依赖于其他镜头的复杂镜头?

haskell - Haddock:用推断的类型签名记录声明?

haskell - 为包含不能有 Eq 或 Show 的字段的 ADT 派生 Eq 和 Show