計算機科学のブログ

型によるプログラミング 直積型と直和型 図形、円、正方形、長方形、外周、面積

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT3(型によるプログラミング)、LESSON16(直積型と直和型)、16.54(練習問題)Q16-2の解答を求めてみる。

コード

type Radius = Double

type Length = Double

type Width = Double

type Height = Double

data Shape
  = Circle Radius
  | Square Length
  | Rectangle Width Height
  deriving (Show)

perimeter :: Shape -> Double
perimeter (Circle r) = 2 * r * pi
perimeter (Square l) = 4 * l
perimeter (Rectangle w h) = 2 * (w + h)

area :: Shape -> Double
area (Circle r) = r * r * pi
area (Square l) = l * l
area (Rectangle w h) = w * h

c :: Shape
c = Circle 2

s :: Shape
s = Square 3

r :: Shape
r = Rectangle 2 3

ss :: [Shape]
ss = [c, s, r]

main = do
  mapM_
    ( \s ->
        putStrLn $
          show s ++ " 外周: "
            ++ show (perimeter s)
            ++ " 面積: "
            ++ show (area s)
    )
    ss

入出力結果(Terminal, Zsh)

% runghc sample2.hs
Circle 2.0 外周: 12.566370614359172 面積: 12.566370614359172
Square 3.0 外周: 12.0 面積: 9.0
Rectangle 2.0 3.0 外周: 10.0 面積: 6.0
%