在Haskell中解释类型类

在Haskell中解释类型类,第1张

在Haskell中解释类型

首先,我总是非常怀疑这种程序结构更直观。编程是违反直觉的,并且总是会因为人们自然而然地根据特定情况而不是一般规则来思考。要更改此设置,需要培训和实践,也称为“编程学习”。

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

因此,“ Num”类型类描述了具有加,减和乘运算符的数字类型。“ Integer”类型是“
Num”的一个实例,这意味着Integer是实现这些运算符的一组类型的成员。

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

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

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

但是,您不能这样写:

sum :: [Num] -> Num

因为“数字”不是类型。

类型和类型类之间的区别是为什么我们在Haskell中不谈论类型的继承和后代。有
一种继承的类型类:你可以声明一个类型类为另一个后裔。这里的后代描述了父代描述的类型的子集。

所有这些的重要结果是,Haskell中不能包含异类列表。在“求和”示例中,可以为它传递一个整数列表或一个双精度列表,但不能在同一列表中混合双精度和整数。这似乎是一个棘手的限制。您将如何实现旧的“汽车和卡车都是汽车的类型”示例?根据实际要解决的问题,有几个答案,但是一般的原则是,您使用一流的函数显式地进行间接 *** 作,而不是使用虚函数隐式地进行间接 *** 作。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5083257.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存