我收到了一份練習來了解 Haskell 中的資料型別,但我不知道如何解決這個問題。
他們給了我一個資料,例如:data CatLista a = Nil | Unit a| Conc (CatLista a) (CatLista a) deriving Eq
我需要使資料型別變為: Nil -> [] , Unit x -> [x] , Conc -> 與 ( ) 相同的運算子
所以如果你跑Conc (Unit 9)(Conc (Unit 5) (Unit 3)) == Conc (Conc (Unit 9) (Unit 5))(Conc (Unit 3) Nil) 應該給真,Conc (Unit 9)(Unit 3) == Conc (Unit 3) (Unit 9)應該給假。
我已經嘗試過像這樣實體化顯示類:
instance Show a => Show (CatLista a) where
show a = case a of
Nil -> []
Unit x -> "[" show x "]"
Conc Nil dos -> show dos
Conc uno Nil -> show uno
Conc uno dos -> "[" show uno "," show dos "]"
我對haskell很陌生,所以我可能不知道一些基礎知識,因為我不明白為什么如果我Conc uno dos -> show uno show dos使用與下面相同的命令運行它(beeing )Conc (Unit 9)(Conc (Unit 5) (Unit 3)) == Conc (Conc (Unit 9) (Unit 5))(Conc (Unit 3) Nil)它仍然回傳False即使很難他們都回傳相同的[9] [ 5][3] 與我的表演實體。
編輯
感謝您,我做到了,它知道正確回傳此代碼預期的值:
toLista :: Eq a => CatLista a -> [a]
toLista Nil = []
toLista (Unit x) = [x]
toLista (Conc a b)
| a == Nil = toLista b
| b == Nil = toLista a
| otherwise = ( ) (toLista a) (toLista b)
instance (Show a,(Eq a)) => Show (CatLista a) where
show a= show (toLista a)
但是我仍然不知道為什么如果我嘗試相同的比較它仍然回傳 False,即使很艱難,我也會回傳相同的 [9,5,3]。
這可能是由于我對 Haskell 缺乏了解,對此感到抱歉。
uj5u.com熱心網友回復:
如果兩個值String在呼叫show它們時產生相同的值,則它們不相等。該(==) :: Eq a => a -> a -> Bool函式由Eqtypeclass實作。因此,您需要為自己實施instanceof 。EqCatLista
的默認實作是Eq,如果deriving Eq兩個值具有相同的資料建構式,則它們是相同的,并且通過呼叫(==)它們,引數在元素上是等效的。
因此,您可以通過以下方式為Eq自己實作該實體:
data CatLista a = Nil | Unit a| Conc (CatLista a) (CatLista a) -- ← no deriving Eq
instance Eq a => Eq (CatLista a) where
ca == cb = toLista ca == toLista cb
uj5u.com熱心網友回復:
因為您包含deriving Eq在資料宣告中,所以您告訴編譯器生成默認的相等方法。編譯器無法讀懂您的想法并知道您打算通過子串列的串聯來表示串列。
您知道您打算Conc [1, 2] [3]表示與Conc [1] [2, 3]1相同的串列;兩者都應視為代表[1, 2, 3]。編譯器不知道這一點。生成的相等方法看到,在一種情況下,我們[1, 2]在Conc建構式的第一個欄位中,而在另一種情況下,我們有[1]. 這兩件事不相等,所以默認的相等方法說整個結構也不相等。
為避免這種情況,請停止處理Show實體。Show是用于轉換CatList為String代碼,將建立它。它與測驗相等性無關。您無法==通過定義Show實體來更改結果。
您需要deriving Eq從資料宣告中洗掉。這意味著編譯器不會生成默認的相等方法,因此您可以撰寫自己的方法來做一些不同的事情(比較兩個CatLists是否代表相同的串列,而不是比較它們是否具有相同的結構)。
1我在這里濫用符號來使用括號語法撰寫子串列;這不是有效代碼,我只是想使子結構中的差異更容易可見。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387032.html
