【发布时间】:2016-04-10 08:31:37
【问题描述】:
This 优秀教程,定义了一个YesNo 类型类和一个YesNo Int 实例如下:
class YesNo a where
yesno :: a -> Bool
instance YesNo Int where
yesno 0 = False
yesno _ = True
这适用于显式类型声明,例如:
*Main> yesno (0::Int)
False
我想避免显式类型声明并使其与Num a 类约束一起使用:
instance (Num a) => YesNo a where
yesno 0 = False
yesno _ = True
但是这个实例定义没有编译并出现错误:
Constraint is no smaller than the instance head
我了解Num 的构造函数数量比YesNo 类多,因此会出现错误。但是如何在不设置 UndecidableInstances 编译器标志的情况下解决这个问题?
【问题讨论】:
-
Num暗示Eq:class (Eq a, Show a) => Num a -
自
base-4.5以来,Eq a, Show a对Num a的约束已被删除 -
UndecidableInstances是相当无害的。可能发生的最坏情况是您创建了一组陷入无限循环的实例。即使在这种情况下,只要编译器终止它的工作,你的程序在运行时就可以正常运行。 -
你说“
Num有更多的构造函数[大概你的意思是“实例”而不是“构造函数”] 比YesNo类和错误“。但这不是错误的正确表征——不是Num的实例数更大,而是您要查找的实例中的类型 在结构上并不小,因此不清楚实例搜索是否会仅从句法参数终止。