随笔-341  评论-2670  文章-0  trackbacks-0
    Kernel FP的模板函数比较严格。对于任意的模板函数的类型参数,这个参数必须能够接受所有类型。当然,类型推导会通过阅读代码来精确化程序员设定的类型。譬如说一个函数F的类型是T->T,但是经过阅读代码发现,参数只能是某种类型的列表,那么类型推导就会将这个函数的类型修改为list T->list T。

    但是这样会有一个问题。类型推导只能够推导已知的函数。如果一个模板函数里面用了操作符,而这个操作符暂时只为几个类型定义的话,那么由于不是所有的类型都能够接受该操作符,所以这个操作符就没办法给未知确切类型的参数使用。下面就有一个例子:
1 {整数加法}
2 def (+) a b = iadd a b
3 
4 {浮点数加法}
5 def (+) a b = fadd a b

    此时函数(+)只能接受int和float两种类型。假设有如下模板函数:
1 def tripleAdd a b c = a + b + c

    那么这个函数的类型是无法推导的,虽然我们的期望是T->T->T->T。另外一个问题是tripleAdd的上下文可能没有任何的(+)的定义,因为有许许多多的(+)可能是在以后出现新类型的时候定义的。于是今天我加入了一个语法:
func (+) T :: T -> T -> T -> T expected

    上面的代码表示在这个声明能控制到的上下文中,只要不被另一个expected覆盖,那么所有的(+)的类型都是T->T->T->T或者是兼容的更加具体的类型。当然了,不符合要求的定义并不会给出警告,只是如果一个(+)的定义不符合要求的话,那么根据语法,不可能被调用到。当然,这个限制可能比较强硬,不过暂时实验一下看看需不需要更加放宽。

    好了,那么编译的时候如何让(+)应用到未知的函数呢?匹配的优先级策略有很多,这个就慢慢制定了……
posted on 2008-11-02 06:52 陈梓瀚(vczh) 阅读(1323) 评论(0)  编辑 收藏 引用 所属分类: 脚本技术

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