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

dtcbnfnu  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(158)

看下面的代码:

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

该代码来自《Learn you a Haskell for Great Good》一书,该书将此代码示例与以下文本一起提供:
注意,在定义一个点时,我们对数据类型和值构造函数使用了相同的名称,这并没有什么特别的意义,尽管如果只有一个值构造函数,那么使用相同的名称是很常见的。
现在我假设data Point = ...是数据类型,... = Point Float...是值构造函数。
我的问题是:在Haskell中,数据类型和值构造函数使用相同的名称是否常见?

5cg8jx4n

5cg8jx4n1#

根据我有限的经验:是的。这也是有意义的。为什么在这里要用不同的方式来调用Point呢?它完美地描述了数据类型,并且也很清楚地用于像这样的模式匹配

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

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

cfh9epnr

cfh9epnr2#

这不是一个直接的答案,而是一个提示的人与同样的问题。
语法突出显示可能有助于区分这两者。例如,前面提到的一些代码的屏幕截图,来自Visual Studio Code with a Haskell Syntax Highlighting extension(带有自定义颜色编码):

顺便说一句,并不是每个人都同意这个公认的答案,例如,见this short post,以及this r/haskell discussion

相关问题