Kernal FP所有表达式种类实现类型推导!

Kernal FP所有表达式种类实现类型推导!
    经过 上一次的成功试验,这次终于完成了剩余的表达式类型的类型推导。过程及结果如下:

    修改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 ))

Kernal FP所有表达式种类实现类型推导!_第1张图片
    结果跟昨天等价的更简单的写法一致。

你可能感兴趣的:(Kernal FP所有表达式种类实现类型推导!)