9

Vector我在 Haskell 中编写了一个数学模块。

所以我开始了:

data Vector a = Vector !a !a !a deriving (Eq, Show)

很好——这让我可以使用任何我想要的数字数据类型。问题是我不想到处写作DoubleVector 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我觉得我真的应该使用那个类型名称。所以我只把它们称为vectors(不大写)——除非我觉得我必须将此约定应用于每种数据类型的每个注释。

有没有人遇到过类似的情况?在这种情况下,谁能想到更优雅的解决方案?

4

2 回答 2

8

解决您的特定问题的一种方法是将数据类型与类型同义词放在不同的模块中。也就是说,有一个Math.Vector包含数据声明和一些通用函数(即适用于所有数字类型的函数)的模块。然后,当您实际Vector Double在代码中大量使用时,只需使用合格的导入创建类型同义词:

import qualified Math.Vector as MV

type Scalar = Double
type Vector = MV.Vector Scalar

我认为从代码组织的角度来看这是有道理的。特别是,如果您已将Vector类型定义为适用于所有数字类型,我希望该模块中的函数也适用于所有数字类型。Vector Double您在代码的其他部分使用了很多的事实不应该影响Vector实际定义的模块。毕竟,想象Vector Int在程序的另一部分使用很多是完全合理的。

顺便说一句,我不确定称之为Vector最好的主意。向量不一定必须具有三个维度,因此我将您的数据类型称为Vector3D. 这实际上是其他一些 API(如 Java 3D API)中使用的名称,因此它可能是一个不错的选择。

于 2012-07-08T09:56:37.217 回答
2

有什么特别的理由不只是做

data Vector = Vector !Double !Double !Double deriving (Eq, Show)

这对我来说似乎是最简单的想法......

于 2012-07-09T09:09:18.420 回答