回答
你不能; ==
有簽名a -> a -> Bool
,所以它不能像這樣使用。
使用convertible
包,你可以定義
(~==) :: (Convertible a b, Eq b) => a -> b -> Bool
x ~== y = case safeConvert x of
Right x' -> x' == y
Left _ -> False
(==~) :: (Convertible b a, Eq a) => a -> b -> Bool
(==~) = flip (~==)
instance Convertible Int D where ...
-- or D Int depending on what you have in mind
,而不依賴於convertible
,你可以只定義轉換功能無論是從Int
到D
(寫a == fromInt 2
),反之亦然。
一個不太推薦的路線(對於這個具體情況,我認爲它比第一個解決方案簡單得多)將是定義你自己的類型類,例如,
class Eq' a b where
(=~=) :: a -> b -> Bool
instance Eq a => Eq' a a where
x =~= y = x == y
instance Eq' D Int where ...
等
我不認爲創建自定義類是一個很好的建議。尤其是對新人來說。 –
@NikitaVolkov我已經有了一個「更合理」的選擇,但我已經改寫了答案,以添加一個更好的(IMO)解決方案,並把它放在最後。 –
我會實現一個投影:
getInt :: D -> Int
getInt (C i _) = i
,然後用它比較:
getInt myD == 5
你甚至可以包括到創紀錄的:
data D = C { getInt :: Int, getFloat :: Float }
如果你喜歡
這可以做,但我懷疑你會想這樣做。正如阿列克謝提到(==)
的類型是Eq a=>a->a->Bool
,所以做這項工作的唯一方法就是讓2
的類型爲D
。最初,這可能看似荒謬,但實際上可製成數字有你想要的任何類型,只要該類型是Num
instance Num D where
fromInteger x = C x 1.0
的實例還有很多事情需要解決,但.. ..
首先,你需要充分執行Num
的所有功能,包括(+)
,(*)
,abs
,signum
,fromInteger
和(negate | (-))
。
呃!
其次,你有那額外的Float
來填寫fromInteger。我選擇了上面的值1.0
,但那是任意的。
三,您還需要實際製作D
一個Eq
的實例,以填寫實際的(==)
。
instance Eq D where
(C x _) == (C y _) = x == y
注意,這也是很隨意的,因爲我需要忽略浮動值,以獲得(==)
做你希望它是什麼。
底線是,這會做你想要做什麼,但在濫用Num
型的成本,以及Eq
型相當嚴重....的Num
型應保留的東西,你居然會考慮爲一個數字,並且Eq
類型應該保留用於比較兩個完整的對象,每個部分都包括在內。
- 1. 不同類型的在Haskell
- 2. Haskell派生的Eq for Existentials類型類的實例
- 3. jQuery的EQ()有不同的類名
- 4. 爲什麼Haskell中的每個類型都不是Eq的一部分?
- 5. Haskell類型同義詞
- 6. Haskell的類型不明確
- 7. Haskell的類型不匹配
- 8. 瞭解Haskell的類型
- 9. Haskell中的類型比較
- 10. Haskell類型類
- 11. Haskell中的類型參數
- 12. Haskell「不」類型約束
- 13. Haskell不能推斷類型?
- 14. Haskell自己的實例類型類
- 15. Haskell中兩個相似的函數如何有不同的多態類型?
- 16. Haskell中Eq的子類中的默認定義
- 17. Haskell中大DAG結構的Eq測試
- 18. Haskell - 使我的數據成爲Eq
- 19. Haskell的對類型
- 20. Haskell:從類型
- 21. 類型在Haskell
- 22. Haskell TypeCast類型
- 23. 如何基於Haskell Groundhog的數據庫類型指定不同的列類型?
- 24. Haskell的類型類與參數類型
- 25. 類型類Haskell中的數據類型
- 26. 無法推斷(Eq a),將Eq添加到類型
- 27. Haskell的類型類速記
- 28. 擴展Haskell的類型類
- 29. Haskell的類型類隱含
- 30. Haskell的類型類錯誤
請注意,因爲我不認爲你會收到關於此事的通知:我編輯了我的答案以添加更好的解決方案。 –