我正在編寫一個圖庫來了解更多關於在Haskell中構建更大的東西的知識,而且我遇到了一個問題。在一個新的Haskell類中輸入有些困惑
基本上,我試圖將Edge
s定義爲一組兩點,即from
點和to
點。但是,我有很多類型的邊緣(加權/不),我不希望他們能夠在中混合。
所以,我的想法是做幾個新的類,Weighted
和Edgy
,以便能夠實現我努力實現的多態行爲的數量。這兩種類型的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不喜歡這一點,因爲a
型Edgy
最終被Edge a
而不是a
,我不知道如何得到它的「下降」進級拉動該類型出爲了返回它。
如果有任何不清楚的地方,請留下評論。
任何幫助非常感謝,我很難過!
謝謝!
,如果你說你期待什麼情況下'Edgy'有,你想要什麼類型的'to'和'這將有助於從'具有這些實例。這就是說,我不相信你甚至需要在這裏上課 - 在實踐中是否真的會增加體重(哈哈)? –
我想'Edgy'的'Edge a'和'WEdge a'實例。 也許我應該稍微貶低一下這個程序吧,對於額外的複雜性是沒有必要的,你可能是對的。儘管如此,我試圖感受到構建一個更大的東西是什麼感覺,所以這就是採用這條路線的想法。 –
如果你想讓這些函數具有類似'Edge a - > Vertex a'的類型,那麼最簡單的事情就是n.m.的答案所暗示的。如果'Edgy'確實需要關心'a'參數,事情可能會更棘手。我仍然試圖首先沒有使用類型類來看它,看看它是怎麼樣的。 –