Haskell“中的单函数类型类命名;呃",;vs";有",;

Haskell“中的单函数类型类命名;呃",;vs";有",;,haskell,naming-conventions,typeclass,naming,Haskell,Naming Conventions,Typeclass,Naming,我发现有时很难找到合理的单函数类型类名。如果方法名称是一个常规动词(如get、write、read…),那么就很容易像Gopher一样使用单个方法接口——在后面粘贴一个“er”(Getter、Writer、Reader…)并完成。但是如果函数名是一个名词(名称、颜色…),那么在后面添加一个“er”将不再有效Namer和COLOR听起来太奇怪了,因为这些词不再是地道的英语 一个解决方案是在前面添加一个“has”。然后会得到HasName、HasColor之类的东西,它也适用于动词——例如HasGe

我发现有时很难找到合理的单函数类型类名。如果方法名称是一个常规动词(如get、write、read…),那么就很容易像Gopher一样使用单个方法接口——在后面粘贴一个“er”(Getter、Writer、Reader…)并完成。但是如果函数名是一个名词(名称、颜色…),那么在后面添加一个“er”将不再有效NamerCOLOR听起来太奇怪了,因为这些词不再是地道的英语


一个解决方案是在前面添加一个“has”。然后会得到HasName、HasColor之类的东西,它也适用于动词——例如HasGet和HasWrite。这是不是一个好办法?建议用什么方法来命名包含名词性内容的单函数类型类?

我建议使用任何前缀表示特定内容,使用任何后缀表示不同内容。此外,类前缀/后缀与成员函数上的前缀/后缀相关。这个公约应该明确地写在某个地方

比如说,

module Lib.Colour.Class

-- The following convention is followed
-- Let class prefixes denote that the member has a certain attribute
-- or has some state internally manipulatable.
--   Has- abstracts record type, accessed with get<ClassRootName>
--   Is-  Things that *are* another type, coereced with as<ClassRootName>
--   Can- Things that are manipulatable in some way, via do<ClassRootName>
-- Let class suffixes denote types who primarily act on other types
--   -er  A thing that does something to another type

class HasColour a where
  getColour :: a -> Colour

class IsColour a where
  asColour :: a -> Colour

class CanColour a where
  doColour :: Colour -> a -> a

class Colourer a where
  colour :: CanColour b => a -> b -> b
module Lib.color.Class
--遵循以下惯例
--让类前缀表示成员具有某个属性
--或者某种状态在内部是可操纵的。
--Has-摘要记录类型,使用get访问
--是-是另一种类型的事物,与as共存
--Can-通过do以某种方式可操纵的事物
--让类后缀表示主要作用于其他类型的类型
---呃,对另一种类型有影响的东西
a班在哪里
getcolor::a->color
类别为a色,其中
asColour::a->颜色
CanColour a班在哪里
颜色:颜色->a->a
a级着色师在哪里
颜色::CanColor b=>a->b->b
从这个惯例中我最喜欢的是赋予前缀和后缀不同含义的概念。考虑到这一点,我写了
CanColour
,而不是
可着色的
,因为可着色的东西被认为具有一种变化的内部状态

关于“颜色”和“名称”的细节,请注意这些名词也是动词。你可以点名,可以染发。我并不觉得在这两个函数中添加一个-er对于代码来说有什么不好的地方——特别是在衡量一致性约定的收益时。在我的示例中,我使用动词形式的color作为成员函数,因此我将只在类约束中使用“color”,这在我看来很好

现在,这个约定最终会在某个时候崩溃,但在它崩溃之前,它应该可以帮助用户(您)在使用库时对调用约定做出合理的猜测。它还可以帮助您在开发新类时进行指导

这是一个建议。在黑客软件包中,我认为没有明确的标准来指导您的设计。对这个问题的前提有一些公正的批评(见评论)。然而,预期的设计确实有先例。例如,
diagrams
包似乎做了一些与您在这里尝试的完全相同的事情。这是一个结构良好的图书馆,由一位很有名望的作家撰写

图表
使用前缀:Is-;有-。它使用后缀:-ed-能够的好吧,也许用的太多了?在我看来,例如,
HasTrace
tracked
相比,似乎可以获得更多的自我一致性


因此,无论您采用何种标准,既然没有明确的一致意见,您至少应该努力实现名称与概念的自我一致性,并在注释中明确说明所采用的标准。

我只是觉得没有必要经常编写非法、单函数、类型的类。也许你可以从一开始就避免编写这样的类,从而避免命名一个类?我支持ThomasM.DuBuisson:如果你的typeclass在某种程度上没有数学意义(因此有一个自然名称),那么你应该问问自己typeclass是否有意义。通常,只使用简单的记录类型更有效。@PetrasPurlys,通常使用函数。;-)尽管我认为,如果没有具体的例子,避免上课的建议可能有点言之过早。另一方面,来到haskell的OO程序员应该避免使用类型类——你的直觉都错了@luqui我认为Show type类可以作为一个例子:您可以不使用它,对每个可打印类型都有单独的函数,但这并不方便。将Show作为类型类精确定义类型的预期行为/属性。你知道实现它的所有类型都是一样的。这使得代码更容易阅读和扩展,你不同意吗?我会使用
命名
彩色