今天在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
虽然这很有意义,但让我感到好奇的是,是否还有其他语言实现了这样的功能-也许是一种“参数级泛型”?
作为后续,实施这样的事情有哪些挑战?
答案 0 :(得分:5)
好的。在Haskell中,这些事情称为“较高等级类型”:它们是允许您“在括号内移动量化”的类型:
ls
在给出的链接中也描述了“挑战”:
通常无法确定Rank-N类型的重建,有些 存在时需要显式类型注释。
不过,只有等级2的类型才是可确定的(请参见here)。这就是为什么要在GHC中启用两个不同的标志的原因。
答案 1 :(得分:1)
人们还可以说C ++支持怪异但功能强大的参数多态性。
template<typename T>
void test(T f)
{
std::cout << f(123) << std::endl;
std::cout << f("wow") << std::endl;
}
int main()
{
test([](auto const & v)
{
// Note: This is a compile-time test
if (std::is_same_v<int, std::decay_t<decltype(v)>>)
{
return 0;
}
else
{
return 1;
}
});
}