首页 > 解决方案 > 是否有任何语言在作为参数传递的函数上实现保留的泛型?

问题描述

今天在 F# 中遇到了这个问题:

let test<'a> (f: 'a -> unit) =
    let x = f 123
    let y = f "wow"
    ()

这会产生编译器错误,因为在 test<'a> 的每次调用中泛型参数必须相同,如下所述: Type inference not working when passing map function

虽然这是有道理的,但我很好奇是否还有其他语言已经实现了类似的东西——也许是一种“参数级泛型”?

作为跟进,实施这样的事情有哪些挑战?

标签: genericstypesfunctional-programmingf#language-design

解决方案


当然。在Haskell中,这些东西被称为“更高等级的类型”:它们是允许您“在括号内移动量化”的类型:

test :: (forall a. a -> ()) -> ()
test f = let x = f 123
             y = f "wow"
         in ()

给出的链接中也描述了“挑战”:

Rank-N 类型重构通常是不可判定的,并且在它们存在时需要一些显式类型注释。

不过,AFAIK(请参见此处)仅可确定 rank-2 类型。这就是为什么在 GHC 中有两个不同的标志来启用它们。


推荐阅读