gpt4 book ai didi

java - 解释 Haskell 中的类型类

转载 作者:可可西里 更新时间:2023-11-01 16:24:13 25 4
gpt4 key购买 nike

我是一名 C++/Java 程序员,我在日常编程中碰巧使用的主要范例是 OOP。在某些线程中,我读到一条评论,类型类在本质上比 OOP 更直观。有人可以用简单的语言解释类型类的概念,以便像我这样的 OOP 人能够理解吗?

最佳答案

首先,我总是非常怀疑这种或那种程序结构更直观的说法。编程是反直觉的,而且总是如此,因为人们自然地根据具体情况而不是一般规则来思考。改变这一点需要培训和实践,也称为“学习编程”。

继续讨论问题的核心,OO 类和 Haskell 类型类之间的主要区别在于,在 OO 中,类(甚至是接口(interface)类)既是类型又是新类型(后代)的模板。在 Haskell 中,类型类只是新类型的模板。更准确地说,类型类描述了一组共享公共(public)接口(interface)的类型,但它本身不是一种类型

所以类型类“Num”描述了带有加法、减法和乘法运算符的数字类型。 “Integer”类型是“Num”的实例,这意味着 Integer 是实现这些运算符的类型集的成员。

所以我可以用这种类型写一个求和函数:

sum :: Num a => [a] -> a

“=>”运算符左侧的位表示“sum”适用于作为 Num 实例的任何类型“a”。右边的位表示它接受一个类型为“a”的值列表,并返回一个类型为“a”的值作为结果。因此,您可以使用它来对整数列表或 double 列表或复杂列表求和,因为它们都是“Num”的实例。 “sum”的实现当然会使用“+”运算符,这就是为什么你需要“Num”类型约束。

但是你不能这样写:

sum :: [Num] -> Num

因为“Num”不是类型。

type 和 typeclass 之间的区别是我们不讨论 Haskell 中类型的继承和后代的原因。 有一种类型类继承:您可以将一个类型类声明为另一个类型类的后代。此处的后代描述了父代描述的类型的子集。

所有这一切的一个重要结果是您不能在 Haskell 中使用异构列表。在“求和”示例中,您可以将整数列表或 double 列表传递给它,但您不能在同一个列表中混合使用 double 和整数。这看起来像是一个棘手的限制;你将如何实现旧的“汽车和卡车都是车辆类型”的例子?根据您实际尝试解决的问题,有多种答案,但一般原则是您使用一流函数显式地进行间接访问,而不是隐式地使用虚函数。

关于java - 解释 Haskell 中的类型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2685626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com