How to make a function useful only for a specific ADT data constructor?

I am currently playing with ADT in Haskell and trying to create ADT Figure:

data Figure = Rect { x :: Integer, y :: Integer, width :: Integer, height :: Integer}
            | Circle { x :: Integer, y :: Integer, radius :: Integer}
            | CombiFigure Figure Figure
            deriving (Eq, Show, Read)

Now I am faced with the question of how to implement a function that everyone should not accept Figure, but, for example, only a Circle.

Do I have a bad design? Or is there some kind of best practice how to do this?

As an example, think of a diameter function. Everything that occurred to me (I am a complete newbie to Haskell), the following two options: undefinedor Maybe:

1

diameter :: Figure -> Integer
diameter (Circle _ _ r) = 2 * r
diameter _ = undefined

2:

diameter :: Figure -> Maybe Integer
diameter (Circle _ _ r) = Just (2 * r)
diameter _ = Nothing

Are there more preferred ways to accomplish this? Thanks!

+4
2

, - . - diameter , . ,

diameter :: Circle -> Integer
diameter (Circle _ _ r) = 2 * r

.

, , Circle ( Rect ):

data Figure = RectFigure Rect
            | CircleFigure Circle
            | CombiFigure Figure Figure
            deriving (Eq, Show, Read)

data Rect = Rect { rectX :: Integer, rectY :: Integer, rectWidth :: Integer, height :: Integer}
          deriving (Eq, Show, Read)

data Circle = Circle { circleX :: Integer, circleY :: Integer, circleRadius :: Integer}
            deriving (Eq, Show, Read)

, : , , Figure , , Figure s.

, Figure, diameter, a CircleFigure, .

: undefined ( ), , . , , . , Maybe/Either.

+4

(i.e data Figure = ...) . width width :: Figure -> Integer, Rect:

\> width $ Rect 1 2 3 4
3
\> width $ Circle 1 2 3 
*** Exception: No match in record selector width

, , , ( diameter ).

, Circle, Rectangle .. ; Figure , .

class Figure a where
    area, perimeter :: a -> Double

instance Figure Circle where
    area = ...
    perimeter = ...

, . (, ), , .

, ; , , Triangle , , , .

data Figure = ... , Figure , Triangle. , .

> , haskell cafe. >

+3

Source: https://habr.com/ru/post/1625636/


All Articles