2016-12-14 85 views
0

我得到這個代碼:哈斯克爾的數據類型無法識別

data Station a b = Machine a b 
      | Line [Station a b] 
     deriving(Show) 

data Machine a b = Req [(a,Int)] b 
    deriving(Show) 


machine :: [(a, Int)] -> b -> Station a b 
machine l b = Req l b 

,當我嘗試編譯,它說,機器的簽名是錯誤的。它表示它是[(a,Int)] - > b - > Machine a b,而不是[(a,Int)] - > b - > Station a b。但在我的數據類型中,我說站a =機器a b。我不明白爲什麼這不起作用?

回答

4

你有兩件東西叫Machine。一個是返回Station類型的類型構造函數,另一個是類型。儘管它們具有相同的名稱,但兩者無關。

通過向數據構造函數添加'(prime)來消除這兩個術語可能有所幫助。這樣,我們就可以扳平Machine'數據構造舉行Machine作爲其唯一參數:

data Station a b = Machine' (Machine a b) 
      | Line [Station a b] 
     deriving(Show) 

現在我們可以更新machine功能,使用新定義的構造:

machine :: [(a, Int)] -> b -> Station a b 
machine l b = Machine' (Req l b) 
+0

啊,我明白了,謝謝!我錯誤地認爲「機器」是一樣的。感謝您爲我清除 – Midasso

+1

@Massasso爲了將來的參考,它是Haskell的<! - language-all:lang-hs - >'。 – Alec