8

我在Haskell中编写了一个数学模型VectorHaskell数据类型别名命名

于是我开始了:

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(不是大写) - 除此之外,我觉得我必须将这个约定应用于每种数据类型的每条评论。

有没有人有过类似的情况?任何人都可以在这种情况下想到更优雅的解决方案?

+0

我已经看到过几次,特别是'language-c'包使用这种方法来定义它的语法树表示。如果你从来没有遇到过这种风格,那么它可能会感觉有点尴尬,但我希望人们能够很快习惯它。 – 2012-07-08 05:13:31

+6

计算机科学只有两件难事:缓存失效和命名事物。 - 菲尔卡尔顿 – 2012-07-08 06:16:40

+2

也许'VectorOf Double',如果你不喜欢'VectorT'。 – kennytm 2012-07-08 08:30:19

回答

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)中使用的名称,所以它可能是一个不错的选择。

2

有什么特殊原因,不只是做

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

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

+0

这也有'{ - #UNPACK# - }'的优点。 – FunctorSalad 2012-07-09 11:19:01

+0

然后我不能让它成为'Functor'和'Applicative'的一个实例。 – mk12 2012-07-10 01:55:34

+0

如果没有其他的东西,那么能够'fmap'任何东西都是很有用的,它使得模块更漂亮。 – mk12 2012-07-10 03:47:46