随笔-341  评论-2670  文章-0  trackbacks-0
    经过上一次的成功试验,这次终于完成了剩余的表达式类型的类型推导。过程及结果如下:

    修改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) 阅读(1477) 评论(1)  编辑 收藏 引用 所属分类: 脚本技术

评论:
# re: Kernal FP所有表达式种类实现类型推导! 2008-10-06 07:51 | 陈坤
光看摘要:
摘要: 经过上一次的成功试验,这次终于完成了生育
我以为你在做什么杂交DNA实验了  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理