java – 在Haskell中解释类型类

前端之家收集整理的这篇文章主要介绍了java – 在Haskell中解释类型类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是一个C / Java程序员,我在日常编程中使用的主要范例是OOP.在某些线程中,我读到一个注释,类型类在本质上比OOP更直观.有人能用简单的话语来解释类型类的概念,以便像我这样的OOP人可以理解吗?

解决方法

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

继续讨论这个问题,OO类和Haskell类型类之间的关键区别在于,在OO中,类(即使是接口类)也是新类型(后代)的类型和模板.在Haskell中,类型类只是新类型的模板.更准确地说,类型类描述了一组共享一个通用接口的类型,但它本身不是一种类型.

所以类型类“Num”用加法,减法和乘法运算符描述数字类型. “整数”类型是“Num”的实例,这意味着Integer是实现这些运算符的一组类型的成员.

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

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

位于“=>”左侧的位运算符说“sum”将适用于任何类型的“a”,它是Num的一个实例.右边的位表示它需要一个“a”类型的值的列表,并返回一个类型“a”的值.因此,您可以使用它来汇总整数列表或双列表或复合体列表,因为它们都是“Num”的实例. “sum”的执行当然会使用“”运算符,这就是为什么你需要“Num”类型约束.

但是你不能写这个:

sum :: [Num] -> Num

因为“Num”不是一个类型.

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

所有这一切的一个重要结果是您不能在Haskell中有异质列表.在“sum”示例中,您可以传递一个整数列表或双精度列表,但是您不能在同一列表中混合双精度和整数.这看起来像一个棘手的限制;你如何实施旧的“汽车和卡车都是车型”的例子?有几个答案取决于您实际想要解决的问题,但一般原则是您使用一级函数明确使用间接方法,而不是隐式使用虚拟函数.

猜你在找的Java相关文章