2013-12-11 41 views
1

我想在Haskell中構建ADT圖。 我不知道如何獲得泛型類型的默認值。如何獲取某種類型的默認值?

type Node = Int 
type Element a = (Node, a, [Int]) --Node: ID; a: generic value; [Int]: adjancent nodes' IDs 
type Graph a = [Element a] 
insNode :: Graph a -> Node -> Graph a 
insNode g n = g ++ [(n,?,[])] 

我必須寫什麼來代替?爲了得到類型a的默認值? 非常感謝提前!

回答

6

你不能。沒有辦法神奇地創建任何類型的值。

還有undefined :: a,但如果評估過,會導致程序崩潰。相反,我建議要麼

type Element a = (Node, Maybe a, [Int]) -- It's optional to have a value 

insNode :: a -> Node -> Graph a -> Graph a 
-- Optional idea, use `Data.Default` to ease the typing burden 
defInsNode :: Def a => Node -> Graph a -> Graph a 
defInsNode = insNode def 

隨着第一個選項,你可以只是堅持Nothing在那裏(這是你真的什麼),或者第二個選項你只需要用戶提供一個值。

最後一個音符的風格,而不是同義詞元組,我建議使用

type Node = Int 
data Element a = Element { node :: Node 
         , val :: Maybe a 
         , edges :: [Node]} 
       deriving (Eq, Show) 

現在你構建這些ElementsElement node val edges並能在幾乎相同的方式模式匹配。超過2個元素的元組通常是錯誤的路線。

+0

也許應該提一下'mempty :: Monoid a => a'?它可能看起來像一個合適的,但我認爲這是一個容易陷入陷阱(即''mempty'只有真正有用和有意義''mappend',也是),一些警告。 –

+0

@LucDanton是的,'Data.Default'是爲這些情況明確定義的,'Monoid'很好,不是。 – jozefg

+0

非常感謝,我剛開始學習Haskell! _Maybe_是一個非常好的主意,用於我的目的和迄今爲止我所研究的內容。 如何使用您的定義訪問元素的成員? –

相關問題