经过
上一次的成功试验,这次终于完成了剩余的表达式类型的类型推导。过程及结果如下:
修改if函数的代码,去掉类型声明:
1 def if cond t f = select cond of
2 case true : t
3 case false : f
4 end
为了对lambda expression进行推导,将makearray的表达式isub max 1替换成(\a->\b->isub a b) max 1:
1 def makearray max = if (iequ max 0)
2 empty
3 (list max (makearray ((\a->\b->isub a b) max 1)))
然后进行推导。由于推导的时候没有根据依赖关系(函数可以循环依赖)来确定推导顺序,因此采用了迭代的方法。编译器不断推导一直到无法得到更好的结果为止(实现的时候有一个很方便的判断方法)。
首先对if进行推导。因为cond使用了true和false进行模式匹配,因此cond一定是system.bool。其次,两个表达式分别返回t与f,可以判断t与f的类型必定相同。因此,可以很容易的得到if的结果:
1 func if T1 :: (system.bool -> (<T1> -> (<T1> -> <T1>)))
其次对makearray进行推导。进行到(\a->\b->isub a b)的时候,因为max类型位置,标记为?,1类型为system.int。因此该lambda expression的期望类型为?1 -> system.int -> ?2。因为isub a b,因此a一定是int,而且isub接受两个int返回bool,因此该lambda expression的推导类型为system.int -> system.int -> system.bool。所以得到makearray的类型如下:
1 func makearray :: (system.int -> (system.list system.int))
结果跟昨天等价的更简单的写法一致。
posted on 2008-10-06 06:47
陈梓瀚(vczh) 阅读(1496)
评论(1) 编辑 收藏 引用 所属分类:
脚本技术