本杰明·皮尔斯(Benjamin C. Pierce)在其书类型和编程语言的第23.8节中写道:
系统F的另一个经过充分研究的限制是 rank-2多态性,由Leivant(1983)引入[...]。如果将一种类型绘制为树,则从其根到∀量词的路径都没有经过2个或更多箭头的左侧,则该类型被称为2级。 [...]在等级2系统中,所有类型都被限制为等级2。在某种意义上,该系统可以将类型分配给更多未类型化的lambda项,因此它比前传(ML)片段功能更强大。
Kfoury和Tiuryn(1990)证明,系统F的等级2片段的类型重构复杂度与ML相同(即DExptime-complete)。 Kfoury and Wells(1999)给出了第一种适用于等级2系统的正确类型重构算法,并表明无法确定系统F的等级3及更高级别的类型重构。
因此,已知用于等级2多态性的类型推断是可判定的,并且自1999年以来就已经知道一种算法。Haskell支持 <?php
// this text was used in 2002
// we want to get this up to date for 2003
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// the callback function
function next_year($matches)
{
// as usual: $matches[0] is the complete match
// $matches[1] the match for the first subpattern
// enclosed in '(...)' and so on
return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year",
$text);
?>
语言扩展,但它启用了等级n多态性。
哪些语言(如果有)实现了rank-2参数多态性,但没有实现System F?
由于类型推断是可以确定的,并且没有最坏的复杂性,为什么SML和OCaml都没有将多态性扩展到rank-2?
为什么我们没有在野生环境中看到并了解更多有关rank-2多态性的信息?