と仮定私は、次のしている:Haskellの多型とリスト
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)]
私はオブジェクト指向の方法で考え、Haskellのにそれを適用しようとしている知っている、それはないかもしれない:リストの要素はすべて同じタイプではありませんので、次のコードはコンパイルされません最良のアプローチ。さまざまな種類のオブジェクトのコレクションを扱う必要があるプログラムにとって、Haskellのアプローチとしては最高のものは何でしょうか?
私はあなたの例をコンパイルすることができませんでした。しかし、あなたが参照するwikiページは私の質問に完全に答えます。 –
今すぐお試しください - 私は 'Shape'のデータコンストラクタの署名に' IsShape'を持っていたはずの 'Shape'を持っていました。 –
今後の読者にとって、このアプローチの欠点は、 'Shape'コンテナから円と四角形を取得するコードは、' IsShape'インスタンスで与えられたもの以外の*プロパティを使用できないことです。あなたは座標を得ることができず、それが 'Circle'か' Rectangle'かどうかを知ることができず、形状ではなく円や矩形に特化して動作する他の関数を呼び出すことはできません。これは、Ganeshが話しているオープン性の根本的な結果です(そして、強制的に型定義されたオブジェクト指向プログラミングでは、 "強制的にダウンキャスト"していると感じます)。 – Ben