【发布时间】:2012-07-08 00:11:29
【问题描述】:
我在 Haskell 中写了一个数学 Vector 模块。
所以我开始了:
data Vector a = Vector !a !a !a deriving (Eq, Show)
很好——这让我可以使用任何我想要的数字数据类型。问题是我不想到处写Double 和Vector Double,原因很简单,我不应该这样做。所以我补充说:
type Scalar = Double
type Vector = Vector Scalar
当然,第二行是错误的,因为现在有两个Vector 声明。那我应该把它改成什么?我对自己想,不,我将在我的代码中编写这个,所以我想将类型别名简单地保留为Vector。这意味着我必须更改数据类型名称。但是如果我改变它,那么我觉得我也应该改变构造函数,这会让一切变得更加混乱。但是,如果以这种方式让构造函数与类型别名具有相同的名称,感觉很尴尬。
现在我有这个:
type Scalar = Double
type Vector = VectorT Scalar
data VectorT a = Vector !a !a !a deriving (Eq, Show)
我随意选择了T(我猜它代表“类型”),但我对此不太确定。通常,当我记录函数时,我会说 -- Calculate the magnitude of a Vector,但对于 VectorT,我觉得我真的应该使用 that 类型名称。所以我只是将它们称为vectors(不大写)——除非我觉得我必须将此约定应用于每种数据类型的每条评论。
有人遇到过类似情况吗?在这种情况下,谁能想到更优雅的解决方案?
【问题讨论】:
-
我在一些场合看到过这种情况,特别是
language-c包使用这种方法来定义它的语法树表示。如果您从未接触过这种风格,可能会觉得有点别扭,但我希望人们很快就会习惯它。 -
计算机科学中只有两个难点:缓存失效和命名。 ——菲尔·卡尔顿
-
如果你不喜欢
VectorT,也许VectorOf Double。
标签: haskell types naming-conventions algebraic-data-types type-alias