Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中类型类的命名约定是什么?_Scala_Haskell_Naming Conventions_Typeclass - Fatal编程技术网

Scala中类型类的命名约定是什么?

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。我完全不知道为什么会选择这些

在Java世界中,接口的命名约定已经非常成熟。例如,当您说某个类实现了接口
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的设计。