假設我有一個簡單的類AClass
,其中有一個公共成員f1
,它可以被覆蓋。與另一個成員f2
定義AClass
的新實例的方法有哪些,但缺少複製源代碼AClass
的方法?下面玩具代碼:用新成員覆蓋類實例
class AClass a where
f1 :: a -> Int
data Val = I Int
instance AClass Val where
f1 x = 0
-- the method below can't be added as it is not public member of AClass
-- f2:: a -> Float
-- f2 x = 0.0
我環顧四周,但我沒有找到如何做到這一點任何明顯的例子(即例子我能理解以及 - 透明度是相對的)。有什麼可能的方法?關閉,新類型聲明還是別的?用上面的玩具編碼演示技術會很有幫助 - 您可以更改data
聲明等(例如,用的newtype
包裝替換它),但上面代碼中唯一不可變的是類聲明AClass
。這是因爲這個假設是這個類已經被一個圖書館作者編寫了,所以我不能碰它。最終的結果應該是繼承AClass
的好處,並增加f2
成員的另一個玩具代碼。
當然會有一些注意事項,在這樣的重寫類中。但是,它有助於瞭解什麼是可能的,以及如何。
- 更新 -
下面的工作代碼 - 感謝Ben和mergeconflict能想出解決方案 - 很少有缺件 - 下面填寫:
class AClass a where
f1 :: a -> Int
class (AClass a) => BClass a where
f2 :: a -> Float
data Val = I Int
instance AClass Val where
f1 _ = 0
instance BClass Val where
f2 _ = 0.0
@ dave4420:感謝編輯示例 – Ben 2011-12-15 06:06:33
是的,支持AClass操作的類,並且f2可以工作。但是,如果我嘗試你的方法,我會得到有關f1不是AnotherClass的可見成員的錯誤。實例f1和f2留給實例,這就是錯誤的來源。 – Sal 2011-12-15 11:58:23