Rust和Haskell的types类的特性有什么区别?

在Rust中的特性看起来至less和Haskell中的types类似,但是我看到有人写了他们之间的一些区别。 我想知道这些差异究竟是什么。

在基本层面上,没有太大的区别,但他们仍然存在。

Haskell将typeclass中定义的函数或值描述为“方法”,正如特征描述它们所包含的对象中的OOP方法一样。 但是,Haskell处理这些问题的方式不同,将它们视为个人价值观,而不是像OOP领导人那样把它们固定在一个对象上。 这是关于最明显的表面水平差异。

到目前为止,Rust不能做的一件事是高级types的特性 ,比如臭名昭着的FunctorMonadtypes特性。

这就意味着Rust的特质只能描述一种被称为“具体types”的东西,换句话说,就是没有一个通用的论点。 然而,Haskell可以创build更高阶的types类,它们使用类似于高阶函数使用其他函数的types,用一个来描述另一个类。 我们不能实现在Rust中提到的types类,因为它不支持这个在Haskell中被认为是基本的,甚至是基本的特性。 值得庆幸的是,最近已经实施了相关的项目 。但是,这不是惯用的Rust,通常被认为是“黑客”。

正如在评论中所说的那样,GHC(Haskell的主编译器)还支持types类的更多选项,包括多参数types(即涉及多个types)types类和函数依赖关系 ,这是一个可爱的选项,允许进行types级计算,并导致打字家庭 。 据我所知,Rust既没有funDeps,也没有types的家庭,虽然它可能在未来。

总而言之,尽pipe表面上的特质和types特质似乎相当,但是当考虑到许多特质时,它们之间的差异就会有很大的差别。


*在一个侧面说明,Swift尽pipe有特点,却没有这样的高级打字机制。 未来更新的语言,也许?

†关于Haskell的types类(包括更高types的类)的一篇很好的文章可以在这里find,Rust的特性同样适用于这个类 ,但不幸的是已经过时了。

Rust的“特性”类似于Haskell的types类。

与Haskell的主要区别是,特征只是用点符号来expression,即forms为a.foo(b)。

Haskelltypes类扩展到更高阶的types。 铁锈性状只是不支持高阶types,因为它们在整个语言中都是缺失的,也就是说,性状和types不是哲学上的区别

我认为当前的答案忽略了Rust特征和Haskelltypes之间最基本的区别。 这些差异与特征与面向对象的语言结构相关的方式有关。 有关这方面的信息,请参阅Rust书 。

  1. 特质声明创build特质types 。 这意味着你可以声明这样一个types的variables(或者说,types的引用)。 你也可以使用特征types作为函数,结构域和参数实例types的参数。

    只要引用对象的运行时types实现了特征,特征引用variables就可以在运行时包含不同types的对象。

     // The shape variable might contain a Square or a Circle, // we don't know until runtime let shape: &Shape = get_unknown_shape(); // Might contain different kinds of shapes at the same time let shapes: Vec<&Shape> = get_shapes(); 

    这不是types类的工作方式。 他们没有创buildtypes ,所以你不能用类名声明variables。 Type类作为types参数的边界 ,但是types参数必须用具体types实例化,而不是types本身。

    你不能有一个不同types的实现相同types类的不同事物的列表。 (相反,Haskell使用存在types来expression类似的东西。)

  2. 特征方法可以dynamic调度 。 这与上面的项目符号强烈相关。

    dynamic分派意味着对象参考点的运行时types用于确定通过引用调用哪个方法。

     let shape: &Shape = get_unknown_shape(); // This calls a method, which might be Square.area or // Circle.area depending on the runtime type of shape print!("Area: {}", shape.area()); 

    同样,在Haskell中使用存在types。

结论是

在我看来,特质本质上与types类相同。 另外,它们还具有面向对象接口的function。

(Haskell的types类更加先进,因为Haskell有更多的types和扩展类似多参数types的类,但是我认为它们本质上是一样的。