栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Haskell中解释类型类

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/425892.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号