决定为Kernel FP加入一个跟模板函有关数的语法

决定为Kernel FP加入一个跟模板函有关数的语法
    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或者是兼容的更加具体的类型。当然了,不符合要求的定义并不会给出警告,只是如果一个(+)的定义不符合要求的话,那么根据语法,不可能被调用到。当然,这个限制可能比较强硬,不过暂时实验一下看看需不需要更加放宽。

    好了,那么编译的时候如何让(+)应用到未知的函数呢?匹配的优先级策略有很多,这个就慢慢制定了……

你可能感兴趣的:(决定为Kernel FP加入一个跟模板函有关数的语法)