这个特性允许class具有多个参数, 这就给在多个维度使用泛型提供了更加方便的支持.
首先看单参数的class:
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
Eq类的两个实例都可以进行比较. 这是一个可交换的,无序的关系.
Compare的关系虽然改变顺序对结果有影响, 但是它仍然同时对两个operand施加了相同的要求.
考虑转化函数:
itofadd::
Integral a, Floating b => a -> b -> b
这定义了一个操作, 对两个操作数分别有两类限制.
如果用多参数类, 可以这样定义:
class ItoFconv a b where
itofadd :: a -> b -> b
instance ItoFconv Int Float where
itofadd = ...
instance ItoFconv Integer Float where
itofadd = ...
...
这样能够达到同样的效果, 但是不当的使用可能使正交性被破坏, 不一定就是好事.
多参数间可以构建(泛)函数依赖, 这个看起来就更有用一些.
(:<:) 是一个类, 他接受两个参数 比如 (a :<: b)
这个类的意思就是左边的参数比右边的参数的数据长度要长.
(Int8 :<: Int16) 就是(:<:)类的instance, 由此可看出来class的构造其实非常像data构造器.
相反, (Int32 :<: Int16) 就不是一个实例. 类型检查的时候就会报告了.
相当于利用类型检查系统进行了逻辑严谨的检查.
阅读(967) | 评论(0) | 转发(0) |