2009-07-05 181 views
14

在Haskell中,可以定義數據類型,像這樣:類型類Haskell中的數據類型

data Point1 = Point1 { 
    x :: Integer 
    , y :: Integer 
} 

可以在一個使用類型類數據類型內部變量?如果是這樣如何?我意識到可以將其作爲代數數據類型來完成,對於每種類型的點都有不同的定義,但是我想知道是否有辦法以更緊湊和更靈活的方式來完成此任務。

例如沿着這線的東西,它使用的函數聲明的語法:

data Point2 = Point2 { 
    x :: (Num a, Ord a) => a 
    , y :: (Num a, Ord a) => a 
} 

這樣做的目的是允許一個存儲詮釋整數浮動值數據類型。理想情況下,我想限制它,使x和y必須是相同的類型。

回答

18

您需要決定是否需要該類型的存在或通用量化。通用量化,鼻翼:

data (Num a, Ord a) => Point2 a = Point2 a a 

產生,對於類型存在Num和奧德實例「A」,但實際上並不利於所有的東西,因爲它所做的就是給你的義務,當你去一個證明義務通過構造該類型的值或者當模式匹配時使用Point類。

在幾乎所有情況下,你最好確定

data Point2 a = Point2 a a deriving (Eq,Ord,Show,Read) 

,使您的每一個實例你想要的額外信息隊伍。

instance Num a => Num (Point2 a) where 
    ... 

instance (Num a, Ord a) => SomeClass (Point2 a) where 
    ... 

這讓你繞過構建較少多餘的字典,並增加了可以用你的POINT2數據類型場景的數量。

另一方面,存在量化可以讓你說,你根本不在乎類型是什麼(更接近你實際要求的類型),代價是你不能使用任何東西對於您指定的約束條件提供的操作 - 這裏很不合適。

7

這樣的事情?

data (Num a, Ord a) => Point2 a = Point2 { 
    x :: a 
    , y :: a 
} 
+8

更常見的情況是,在數據聲明中脫離了上下文,並在類型實際使用的位置使用「(Num a,Ord a)=> Point2 a」,但這也起作用。 – ephemient 2009-07-05 06:37:02

+0

謝謝。如果我看到它,那完美無缺,甚至有意義。 – Gregyski 2009-07-05 06:40:09