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