假設我有以下幾點:哈斯克爾多態性,並列出
class Shape a where
draw a :: a -> IO()
data Rectangle = Rectangle Int Int
instance Shape Rectangle where
draw (Rectangle length width) = ...
data Circle = Circle Int Int
instance Shape Circle where
draw (Circle center radius) = ...
有什麼辦法,我定義形狀的列表,遍歷了名單,並呼籲每個形狀繪製函數?下面的代碼將無法編譯,因爲列表中的元素並不都是相同類型:
shapes = [(Circle 5 10), (Circle 20, 30), (Rectangle 10 15)]
我知道我想在OO方式,並試圖將其應用到哈斯克爾,這可能不是最好的方法。對於需要處理不同類型對象集合的程序,最好的Haskell方法是什麼?
我無法讓你的例子編譯。但是,你參考的維基頁面完美地回答了我的問題。 – 2009-06-15 14:38:29
立即嘗試 - 我有一個`Shape`,我應該在`Shape`的數據構造函數的簽名中擁有`IsShape`。 – 2009-06-15 15:06:18
對於未來的讀者來說值得注意的是,這種方法的缺點是代碼從`Shape`容器中獲取圓和矩形將不能使用* IsShape實例中給出的任何其他屬性;你無法獲取座標,無法判斷它是一個`Circle`還是`Rectangle`,並且不能調用任何專門用於圓形或矩形的其他函數,而不是任何形狀。這是Ganesh正在談論的開放性的一個基本結果(當你感到被迫「沮喪」時,出現在靜態類型的OO編程中)。 – Ben 2014-02-27 20:29:27