Chinaunix首页 | 论坛 | 博客
  • 博客访问: 336047
  • 博文数量: 105
  • 博客积分: 2730
  • 博客等级: 少校
  • 技术积分: 1110
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-20 12:09
文章分类

全部博文(105)

文章存档

2013年(3)

2012年(2)

2011年(36)

2010年(34)

2009年(6)

2008年(20)

2007年(4)

分类: PHP

2011-06-24 16:19:32

这个特性允许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) 就不是一个实例. 类型检查的时候就会报告了.
相当于利用类型检查系统进行了逻辑严谨的检查.



阅读(907) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~