top page > computer > haskell > web_lecture > for_programmer > point_is_point.html
更新日:
文責: 重城良国

点は点だ

cpd2.hs

はじめに

直交座標と極座標のどちらで表現しても点は点だ。同じ平面上にプロットすることもできる。

まとめてしまおう

直交座標と極座標のどちらの表現も可能な点の型は

data Point = Cartesian Double Double | Polar Double Double
deriving Show

となる。

n倍する

パターンマッチでそれぞれの値構築子用の計算を行う。

mul :: Point -> Double -> Point
mul (Cartesian x y) n = Cartesian (x * n) (y * n)
mul (Polar d r) n = Polar (d * n) r

point1, point2 :: Point
point1 = Cartesian 8 5
point2 = Polar 6 (pi / 3)

% ghci cpd2.hs
*Main> mul point1 3
Cartesian 24.0 15.0
*Main> mul point2 2
Polar 12.0 1.0471975511965976

直交座標か極座標かを気にすることなくn倍できる。

構文

data [型名] = [型構築子1] [型1-1] [型1-2] ... | [型構築子2] [型2-1] [型2-2] ... | ...

列挙型との関係

トランプのスートの定義は

data Suit = Spade | Heart | Diamond | Club

だった。これは型構築子のとる引数の数が0であるということだ。data構文は列挙型、構造体、共用体の機能を美しく融合させたものになっている。

まとめ

代数的データ型は新しい型を作る。新しい型を作るのに複数の型をひとつにまとめたり複数の型の組のどれかを選んだりすることができる。同じ枠組みで列挙も実現している。

課題

  1. 円(Circle)、正方形(Square)、長方形(Rectangle)を含むShape型を定義せよ
  2. 正方形を正しい表現に修正する関数squareを作成せよ

「直交座標と極座標」へもどる 「関数としての値構築子」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics