rust - 这个理解对吗: trait and function overloading both achieved ad hoc polymorphism but in different direction

标签 rust polymorphism typeclass adhoc-polymorphism

我正在学习一些多态性。

rust 地址 trait 的 wiki 页面是 method to achieve ad hoc polymorphism ,以及 ad hoc polymorphism 的页面说函数重载是特别多态性的一个例子。

根据我目前的理解水平,如果提供不同类型的参数将调用不同的实现,则函数是临时多态的。但是 traitfunction overloading 看起来很不一样:trait 添加了对类型参数的约束,任何类型实现了 trait 是可接受,虽然函数重载对具体类型进行重载,但任何未重载的类型都是 Not Acceptable 。

我可以说 traitfunction overloading 在相反的方向上实现了临时多态性吗?由于 trait 是通过特化而 overloading 是通过泛化?

PS:在c++中,模板特化也可以根据传入的类型参数提供不同的实现,这也是ad hoc多态性的一个例子吗?

最佳答案

实现特征涉及提供行为的实现,它是特定于类型的并且与其他实现(“临时”)分开,并且可以在调用站点以与其他实现相同的拼写调用(“多态”)。它与函数重载的方向相同。

在 C++ 中,您可以提供重载来实现临时多态性:

void foo(const X&) { ... }
void foo(const Y&) { ... }
// can call foo(z) where z is an X or a Y

你可以用 Rust 中的特征做同样的事情:

trait Foo { fn foo(); }
impl Foo for X { ... }
impl Foo for Y { ... }
// can call z.foo() where z is an X or a Y

我认为您指的“另一个方向”是能够通过类型支持的行为来限制泛型。在 Rust 中,这看起来像:

fn bar<T: Foo>(t: T) { ... }
// bar can use t.foo()

C++ 有一个类比:

template<typename T> concept Foo = requires(T t) { foo(t); };
void bar(Foo auto& t) { ... }
// bar can use foo(t)
// (this uses really new C++, it's written differently in older C++)

受约束的泛型函数不是特别的多态性,因为它们有一个适用于所有参数类型的实现,这些参数类型实现了对它们的任何要求。

总而言之,traits 为通用函数提供了特殊的多态性和约束,一些语言(如 C++)使用不同的设备来实现相同的目的。 C++ 中的临时多态性通常通过函数重载来实现。模板特化也可以实现。

关于rust - 这个理解对吗: trait and function overloading both achieved ad hoc polymorphism but in different direction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63221632/

相关文章:

generics - 使用泛型函数制作盒装特征会返回错误

rust - 引用上的Rust调用方法

C++:Shared_Ptr 在虚拟方法调用上出现段错误,但不是取消引用

coq - 类型类的访问器?

rust - 禁用堆分配的 Rust 编译器标志是什么?

types - Rust 中的 Some 和 Option 有什么区别?

c++ - 在多态对象之外多态地调用函数

c++ - 通过引用传递是否总能避免切片问题?

Haskell 类依赖

haskell - 如何在本地使用 UndecidableInstances?