是否有任何语言在作为参数传递的函数上实现保留的泛型?

3 generics f# types functional-programming language-design

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

let test<'a> (f: 'a -> unit) =
    let x = f 123
    let y = f "wow"
    ()
Run Code Online (Sandbox Code Playgroud)

这会产生编译器错误,因为通用参数在每次调用test <'a>时必须相同,如下所述: 类型推断在传递map函数时不起作用

虽然这是有道理的,但是如果有任何其他语言已经实现了这样的东西 - 这可能是一种"参数级别的泛型",这让我很好奇吗?

作为后续行动,实施这样的事情面临的挑战是什么?

phi*_*ler 5

当然.在Haskell中,这类事物被称为"更高等级类型":它们是允许"在括号内移动量化"的类型:

test :: (forall a. a -> ()) -> ()
test f = let x = f 123
             y = f "wow"
         in ()
Run Code Online (Sandbox Code Playgroud)

"挑战"也在给出的链接中描述:

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

但是,只有排名2类型是可判定的,AFAIK(见这里).这就是为什么在GHC中有两个不同的标志来启用它们.