2017-11-08 9 views
1

私はハスケル:指定された種類の図のリストを取得するには?

database :: [Shape] 
database = [(Circle (Point 2 5) 5), (Circle (Point 1 4) 3), (Circle (Point 8 3) 4), 
    (Rectangle (Point 0 5) (Point 10 0)), (Rectangle (Point 3 5) (Point 10 0)),(Rectangle (Point 0 10) (Point 20 0)), 
    (Triangle (Point 1 1) (Point 2 2) (Point 3 1)), (Triangle (Point 2 5) (Point 5 8) (Point 9 1))] 

よう

data Point = Point Float Float deriving (Show) 
data Shape = Circle Point Float | 
     Rectangle Point Point | 
     Triangle Point Point Point | 
     Label Point Font String deriving (Show) 

そして、データベースなどのユーザー・データ・タイプは、どのように私はこのことから指定した型の数値を得ることができますか?

+1

用語のノートを動作します。 'Circle'、' Rectangle'、 'Triangle'、' Label'はコンストラクタです。リストには、1つのタイプの値しか含めることができません。 – Carl

答えて

2

、その後

isCircle :: Shape -> Bool 
isCircle (Circle _ _) = True 
isCircle _ = False 

のように、それによってフィルタ述語を宣言します。

databaseCircles = filter isCircle database 

しかし、私はあなたの種類のビットを分解するためにあなたをお勧めする:

data Circle = Circle Point Float 
data Rectangle = Rectangle Point Point 
data Triangle = Triangle Point Point Point 
data Label = Label Point Font String 
data Shape = CircleShape Circle | RectangleShape Rectangle 
    | TriangleShape Triangle | LabelShape Label 

をタイプセーフなサークル(または四角形など)のリストを作成できるように:

getMaybeCircle:: Shape -> Maybe Circle 
getMaybeCircle (CircleShape c) = Just c 
getMaybeCircle _ = Nothing 

filterCircles :: [Shape] -> [Circle] 
filterCircles = catMaybes . map getMaybeCircle 

注:catMaybesは、Data.Maybeです。 `Shape`がタイプです:

+0

さあ、そうです。どうも:) –

関連する問題