我在 Haskell 中使用以下简单代码时遇到了麻烦:
import Prelude hiding (cycle).
class ICycle a where
cycle :: a -> a
instance ICycle [a] where
cycle [] = []
cycle (x:xs) = xs ++ [x]
instance ICycle Bool where
cycle True = False
cycle False = True
instance Num a => ICycle a where
cycle n = n+1
main = do
print $ cycle $ [1,2,3]
print $ cycle $ True
print $ cycle $ 42
这里前两个实例声明按预期工作,但第三个实例声明根据标志组合触发各种错误。
我知道它Num a
不短ICycle a
,因此编译器无法完成类型检查。在示例中,我已经看到通过使右侧成为更大的术语或首先将感兴趣的类声明为其他类的子类来规避这一点。相反,在这里,我基本上想将现有类声明为新类的子类。
我想知道是否有人反对这种类型类的使用。或者,如果有一个自然的解决方案。