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

Generics 是否有任何语言在作为参数传递的函数上实现保留泛型?,generics,types,functional-programming,f#,language-design,Generics,Types,Functional Programming,F#,Language Design,今天在F#遇到这个: let测试单元)= 设x=f 123 让y=f“哇” () 这会产生编译器错误,因为每次调用test时,泛型参数必须相同Sure。在中,这些东西被称为“高等级类型”:它们是允许您“在括号内移动量化”的类型: “挑战”也在给出的链接中描述: 秩-N型重构在一般情况下是不可判定的 显式类型注释是必需的 不过,只有排名2的类型是可判定的(参见)。这就是为什么GHC中有两个不同的标志。 < P>也可以说C++支持它,但是它是奇怪的但非常强大的参数多态性。 template<

今天在F#遇到这个:

let测试单元)=
设x=f 123
让y=f“哇”
()
这会产生编译器错误,因为每次调用test时,泛型参数必须相同Sure。在中,这些东西被称为“高等级类型”:它们是允许您“在括号内移动量化”的类型:

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

秩-N型重构在一般情况下是不可判定的 显式类型注释是必需的


不过,只有排名2的类型是可判定的(参见)。这就是为什么GHC中有两个不同的标志。

< P>也可以说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;
      }
    });
}
模板
孔隙试验(TF)
{

std::不可能复制我不认为这是一个复制,特别是因为这个问题只有通过使用涉及内联和接口/类成员的变通方法才能得到回答。我想问的是,是否有任何语言可以为第一类函数实现这种功能,以及像这样的特性对languag提出了什么挑战e开发,而不是为什么它不起作用,我已经从上面链接的答案中理解了这一点。你可以传递一个具有泛型方法的非泛型接口,而不是函数参数。@ckemper fair!酷!我喜欢他们在这里使用一个让人想起形式数学的功能,有趣的东西。类型理论几乎是形式化的L数学以程序的形式实现:有趣的是C++是如何实现这一点的!
test :: (forall a. a -> ()) -> ()
test f = let x = f 123
             y = f "wow"
         in ()
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;
      }
    });
}