Exception 为什么Haskell中的()是枚举类型,而不是haven';t实现了succ功能

Exception 为什么Haskell中的()是枚举类型,而不是haven';t实现了succ功能,exception,haskell,enums,ghc,typeclass,Exception,Haskell,Enums,Ghc,Typeclass,我发现 因此,mean()是Enum的一个实例,应该已经实现了such函数。但是,当我尝试such()时,我得到了***异常:Prelude.Enum。(.such:错误参数 我搜索了GHC.Tuple的源代码,其中应该定义()的类型,但是GHC.Tuplesucc函数只为具有后续变量的参数定义 Prelude> :i () data () = () -- Defined in `GHC.Tuple' instance Bounded () -- Defined in `GHC.En

我发现

因此,mean()是Enum的一个实例,应该已经实现了
such
函数。但是,当我尝试
such()
时,我得到了
***异常:Prelude.Enum。(.such:错误参数


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

succ
函数只为具有后续变量的参数定义

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'

因此答案是:函数被实现了,它总是(正确地)返回一个错误。

这是因为
Enum
typeclass过时了,没有遵循现代最佳实践。部分函数不好。@PhilipJF:我不同意这一点。部分函数是生活中的一个事实——类型系统的功能还不够强大,不允许我们将某些函数表示为总函数而不需要跳转。我不会使用
或者
跳转。现代最佳实践将
succ
pred
类型设置为
a->可能是a
,并添加名称较长的部分版本。接受这样一种观点,例如,在
Int
上除法是一个部分函数是一回事,在没有充分理由的情况下使函数部分化是另一回事。
()
Enum
实例非常愚蠢和误导,甚至超出了
Enum
类本身的可怕程度。@Enrico:Haskell有一种普遍的看法,我们应该朝着总体函数的方向发展。并非所有人都同意,这也并不总是合理的,但Enum是一个简单的例子,我们可以在其中使用,例如
suc::a->可能是a
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