Scala中类型类的命名约定是什么?
在Java世界中,接口的命名约定已经非常成熟。例如,当您说某个类实现了接口Scala中类型类的命名约定是什么?,scala,haskell,naming-conventions,typeclass,Scala,Haskell,Naming Conventions,Typeclass,在Java世界中,接口的命名约定已经非常成熟。例如,当您说某个类实现了接口Comparable,您可以说它的对象是Comparable的。然而,TypeClass的命名约定还不是很完善。例如,Int有一个Numeric隐式可用,因此您可以说“Int是一个Numeric类型”。但是还有typeclass排序。我不明白为什么选择这个名字。“Int是一种Ordering类型”没有任何意义。也许它应该被理解为“Int类型具有顺序”。然后在Scalaz中有Equal和Show。我完全不知道为什么会选择这些
Comparable
,您可以说它的对象是Comparable的。然而,TypeClass的命名约定还不是很完善。例如,Int
有一个Numeric
隐式可用,因此您可以说“Int
是一个Numeric
类型”。但是还有typeclass排序
。我不明白为什么选择这个名字。“Int
是一种Ordering
类型”没有任何意义。也许它应该被理解为“Int
类型具有顺序
”。然后在Scalaz中有Equal
和Show
。我完全不知道为什么会选择这些名称(除了Haskell中的名称外)。我试着查看类型类的母语Haskell,寻找一个好的命名约定,但发现实际上并不存在。Haskell的人似乎并不真正关心姓名(这是我从邮件列表讨论中收集到的)。但来自Java世界,我确实很在乎名字。我不太习惯“类型说一切”的模式
问题是:在命名TypeClass时,您遵循哪些命名约定?实际上,在Haskell中,事情基本上很简单:类型类通常是根据操作所表示的内容命名的,而不是根据类型参数所表示的内容 例如:
,读取
:定义标准字符串序列化/反序列化函数的类型类显示
,Eq
:分别定义等式和排序关系的类型类Ord
:定义“后续”操作的类型类,即其值可以枚举Enum
,Monoid
,Functor
:定义与类似命名的数学结构相关的运算的类型类Monad
Num
是一类类型,在这些类型上定义了一组模糊的面向算术运算的特殊集合,但没有理由认为Num
的实例实际上必须是传统意义上的数字。这可能被手工写成“支持数字操作的类型”,假装“数字”在这个短语中实际上意味着任何东西
简而言之,Numeric
可能是一个很难模仿的例子,如果一个类型类只有一个函数(可能有多个变量),那么在该函数之后命名类几乎总是安全的,就像show
与show
一样
但实际上,主要的事情是考虑类型类上的函数,而不是类型参数。想想动词,而不是名词。不管怎样,名词都是愚蠢的、惰性的东西,所以从动作和操作的角度来思考可能会导致更好的程序设计。说得好。在面向对象的世界中,命名约定侧重于对象(以及相关的“is a”关系)。在面向函数的世界中,命名约定侧重于函数(更像是“has”关系。这种数据类型有monad操作。这种数据类型有排序操作)。@Dan Burton:真正令人伤心的是,虽然代数数据类型中谈论“事物”很有意义,物体天生就是高阶野兽,最自然地表现出主动行为。在Haskell中,避免对函数进行抽象的面向数据的设计只是有点笨拙和过于僵化;面向对象语言中的面向数据的设计是有害的。关于名称/动词二分法,我想到了Steve Yegge的设计。