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

时间:2018-12-07 06:16:34

标签: generics types functional-programming f# language-design

今天在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

虽然这很有意义,但让我感到好奇的是,是否还有其他语言实现了这样的功能-也许是一种“参数级泛型”?

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

2 个答案:

答案 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;
      }
    });
}