學習臭名昭著的博客文章廢棄你的型別類,為了學習,但特別是要理解forall型別類實體宣告的含義,如此處所述顯式通用量化(forall)
除了在型別簽名中,您還可以在實體宣告中使用顯式 forall:
例如forall a。等式 a => 等式 [a] 其中 ...
這通常是在我完善對forallhaskell 的理解的背景下,其中我學會了如何小心其范圍。
因此,為了明確起見,我一直在嘗試 為以下用例重現您的型別類方法的廢品:
data DatumType a b = Datum a b deriving Show
instance forall a b . (Eq a, Eq b) => Eq (DatumType a b) where
(==) (Datum x y) (Datum z e) = x == z && y == e
將 Eq 重命名為 Same,即但宣告為
data Same a = Same {
(===) :: a -> a -> Bool
}
但是我被困在這里,因為我看不到如何用 forall ab 撰寫實體
SameDatumTypeab :: ???
SameDatumTypeab = Same {
-- ???
}
有人可以幫忙嗎?這甚至可能嗎?
uj5u.com熱心網友回復:
沒有什么是你想不出一些試驗和錯誤的......
sameDatumTypeab :: ? a b . (Eq a, Eq b) => Same (DatumType a b)
sameDatumTypeab = Same {
(===) = \(Datum x y) (Datum z e) -> x==z && y==e
}
像往常一樣,forall 是可選的(出現的變數在最外層是隱式通用量化的),即您可以簡單地撰寫
sameDatumTypeab :: (Eq a, Eq b) => Same (DatumType a b)
sameDatumTypeab = Same $ \(Datum x y) (Datum z e) -> x==z && y==e
但實際上這有點忽略了廢棄你的類,因為我現在正在使用這個Eq類,盡管我沒有實體化它。為了使其完全無類,我們還想轉換(Eq a, Eq b)約束:
sameDatumTypeab :: Same a -> Same b -> Same (DatumType a b)
sameDatumTypeab (Same eqa) (Same eqb)
= Same $ \(Datum x y) (Datum z e) -> eqa x z && eqb y e
FTR,型別類實體也不需要顯式量化
instance (Eq a, Eq b) => Eq (DatumType a b) where
Datum x y == Datum z e = x == z && y == e
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/448838.html
下一篇:如何為影像添加標簽?
