在Haskell中对数据类型和值构造函数使用相同的名称是否常见?

时间:2016-06-20 08:19:19

标签: haskell typeclass

查看以下代码:

data Point = Point Float Float deriving (Show)  
data Shape = Circle Point Float | Rectangle Point Point deriving (Show)  

来自“了解大家的Haskell”一书,该代码示例附带以下文字:

  

请注意,在定义点时,我们对数据类型和值构造函数使用相同的名称。这没有特殊含义,但如果只有一个值构造函数,则使用与该类型相同的名称是很常见的。

现在我的假设是data Point = ...是数据类型,... = Point Float...是值构造函数。

我的问题是:在Haskell中对数据类型和值构造函数使用相同的名称是否常见?

2 个答案:

答案 0 :(得分:9)

根据我有限的经验:是的。这也是有道理的。为什么你会在这里以不同的方式致电Point?它完美地描述了数据类型,并且还可以用于模式匹配,如此

myFunc :: Point -> Bool
myFunc (Point 0 0) = True
myFunc _ = False

这是明确的,因为您只能将数据类型放在函数的类型签名中。

答案 1 :(得分:1)

这不是直接答案,而是针对有相同问题的人的提示。

语法突出显示可能有助于区分两者。例如,前面提到的一些代码的屏幕快照,来自带有a Haskell Syntax Highlighting extension(带有自定义颜色编码)的Visual Studio Code:

Haskell syntax highlighting

顺便说一下,并非所有人似乎都同意接受的答案。例如,请参见this short post以及有关this r/haskell discussion的信息。