2012-12-13 54 views
0

我正在編寫一個圖庫來了解更多關於在Haskell中構建更大的東西的知識,而且我遇到了一個問題。在一個新的Haskell類中輸入有些困惑

基本上,我試圖將Edge s定義爲一組兩點,即from點和to點。但是,我有很多類型的邊緣(加權/不),我不希望他們能夠在中混合。

所以,我的想法是做幾個新的類,WeightedEdgy,以便能夠實現我努力實現的多態行爲的數量。這兩種類型的Edge將是Edgy,但只有加權Edge類型將是Weighted

Weighted類很簡單,因爲它只需要修改整個對象。這是什麼樣子:

class Weighted a where 
    modifyWeight :: (Unbounded Int -> Unbounded Int) -> a -> a 

其中Unbounded是民型我扔在一起,支持無限大的和小的數字。這很簡單,因爲我只需要返回a

我堅持的是得到Edgy類來返回類類型的類型(???不知道如何把這個,內部類型,也許?)。爲了使這個更清楚,這裏就是我的工作,可能會更有意義:

class Edgy a where 
    to :: a -> Vertex a 
    from :: a -> Vertex a 

其中Vertex是包裝類 - 的Edge聲明,我試圖使這裏在這裏:

data Edge a = Edge (Vertex a) (Vertex a) deriving (Show, Eq) 

data WEdge a = WEdge (Vertex a) (Vertex a) (Unbounded Int) deriving (Show, Eq) 

所以,我真正想要做的是說「好的,如果你是Edgy類的成員,你應該能夠返回Edge類型的Vertex」。

但是,GHC不喜歡這一點,因爲aEdgy最終被Edge a而不是a,我不知道如何得到它的「下降」進級拉動該類型出爲了返回它。

如果有任何不清楚的地方,請留下評論。

任何幫助非常感謝,我很難過!

謝謝!

+2

,如果你說你期待什麼情況下'Edgy'有,你想要什麼類型的'to'和'這將有助於從'具有這些實例。這就是說,我不相信你甚至需要在這裏上課 - 在實踐中是否真的會增加體重(哈哈)? –

+0

我想'Edgy'的'Edge a'和'WEdge a'實例。 也許我應該稍微貶低一下這個程序吧,對於額外的複雜性是沒有必要的,你可能是對的。儘管如此,我試圖感受到構建一個更大的東西是什麼感覺,所以這就是採用這條路線的想法。 –

+1

如果你想讓這些函數具有類似'Edge a - > Vertex a'的類型,那麼最簡單的事情就是n.m.的答案所暗示的。如果'Edgy'確實需要關心'a'參數,事情可能會更棘手。我仍然試圖首先沒有使用類型類來看它,看看它是怎麼樣的。 –

回答

3

您可能需要使用類型構造類,而不是類型類

class Edgy e where 
    to :: e a -> Vertex a 
    from :: e a -> Vertex a 

instance Edgy Edge where ... 
+0

這正是我一直在尋找的,謝謝!看着它,這似乎很明顯,所以這是我將來必須牢記的事情。 –