Rust和Haskell的types类的特性有什么区别?
在Rust中的特性看起来至less和Haskell中的types类似,但是我看到有人写了他们之间的一些区别。 我想知道这些差异究竟是什么。
在基本层面上,没有太大的区别,但他们仍然存在。
Haskell将typeclass中定义的函数或值描述为“方法”,正如特征描述它们所包含的对象中的OOP方法一样。 但是,Haskell处理这些问题的方式不同,将它们视为个人价值观,而不是像OOP领导人那样把它们固定在一个对象上。 这是关于最明显的表面水平差异。
到目前为止,Rust不能做的一件事是高级types的特性 ,比如臭名昭着的Functor
和Monad
types特性。
这就意味着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书 。
-
特质声明创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类似的东西。)
-
特征方法可以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的类,但是我认为它们本质上是一样的。