为什么Haskell中的()是Enum类型但没有实现succ函数

Tor*_*nny 1 enums haskell exception typeclass ghc

我发现

Prelude> :i ()
data () = ()    -- Defined in `GHC.Tuple'
instance Bounded () -- Defined in `GHC.Enum'
instance Enum () -- Defined in `GHC.Enum'
instance Eq () -- Defined in `GHC.Classes'
instance Ord () -- Defined in `GHC.Classes'
instance Read () -- Defined in `GHC.Read'
instance Show () -- Defined in `GHC.Show'
Run Code Online (Sandbox Code Playgroud)

所以,mean()是Enum的一个实例,应该已经实现了该succ函数.但是,当我尝试时succ (),我得到了*** Exception: Prelude.Enum.().succ: bad argument

我搜索了GHC.Tuple应该定义()类型的源代码但是GHC.Tuple

Die*_*Epp 10

succ函数仅为具有后继的参数定义.

Prelude> succ False
True
Prelude> succ True
*** Exception: Prelude.Enum.Bool.succ: bad argument

Prelude> succ 0
1
Prelude> succ 1
2
Prelude> succ ((2^63 - 1) :: Int)
*** Exception: Prelude.Enum.succ{Int}: tried to take `succ' of maxBound

Prelude> succ ()
*** Exception: Prelude.Enum.().succ: bad argument
Run Code Online (Sandbox Code Playgroud)

所以答案是:函数已实现,它只是(正确地)返回错误.

  • 这是因为`Enum`类型类是过时的,并没有遵循现代最佳实践.部分功能很糟糕. (6认同)
  • 我不打电话使用`Maybe`跳过篮球.现代最佳实践会给`succ`和`pred`类型`a - > Maybe a`,并添加更长名称的部分版本. (5认同)
  • 接受这一点,例如,对`Int`的除法是一个部分函数是一回事,使得函数偏在一起是没有正当理由的另一个.`()`的`Enum`实例只是痛苦愚蠢和误导,甚至超越了`Enum`类本身的开始. (4认同)
  • @PhilipJF:我不得不在那里不同意.部分函数是生活中的事实 - 类型系统根本不够强大,不足以让我们将某些函数表达为总函数而不会跳过箍. (3认同)