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

直交座標と極座標

直交座標と極座標

平面上の点は横と縦の位置で決まる。直交座標(XY座標)上で点はX座標上の位置xとY座標上の位置yとで(x, y)と表せる。「南から3番目の道路と西から5番目の道路が交差するところ」のような言いかたが直交座標の考えかただ。

極座標上では点は原点からの距離dとX軸からの角度rで(d, r)のように表せる。指でさしながら「こっちの方向に100m行ったところ」のように示すということだ。

型シノニム

cpt.hs

直交座標

直交座標による点の表現はx, yのそれぞれの値を表す実数値の組となる。型シノニムで

type Cartesian = (Double, Double)

とする。

n倍する

原点とその点を通る線上にあり原点からの距離が同じ向きでn倍となるような点を求める。

[点(8, 5)を3倍にする図]

x, yのそれぞれをn倍すれば良いので

mulC :: Cartesian -> Double -> Cartesian
mulC (x, y) n = (x * n, y * n)

となる。

例として

point1 :: Cartesian
point1 = (8, 5)

を定義しておく。

% ghci cpt.hs
*Main> mulC point1 3
(24.0,15.0)

極座標

原点からの距離dとX座標からの角度(ラジアン値)rで(d, r)のように表せる。型シノニムで

type Polar = (Double, Double)

とする。

n倍する

原点とその点を通る線上にあり原点からの距離が同じ向きでn倍となるような点を求める。

[点(10, pi / 6)を3倍にする図]

原点からの距離だけn倍すれば良い。

mulP (d, r) n = (d * n, r)

point2 :: Polar
point2 = (10, pi / 3)

*Main> :reload
*Main> mulP point2 3
(30,0.5235987755982988)

どっちがどっち

point1にmulPをpoint2にmulCを適用する。

*Main> mulP point1 3
(24.0,5.0)
*Main> mulC point2 3
(18.0,3.141592653589793)

何事もなかったかのように誤った計算が続いていく。「見た目上問題ない」->「突然の死」->「徹夜」コース。

代数的データ型

cpd.hs

はじめに

見えないところに潜伏するバグ、ほら、あなたの背後にも。暑い夏に背筋が寒くなる体験を求めているのでなければ代数的データ型を使って型による静的チェックの恩恵を受けよう。「正しくないとコンパイラが通らない」ということ。PerlやRubyでは味わえない安心感を手にいれよう。

直交座標

代数的データ型では

data Cartesian = Cartesian Double Double deriving Show

となる。対話環境で表示できるようにderiving Showをつける。

n倍する

値構築子Cartesianでパターンマッチする。

mulC :: Cartesian -> Double -> Cartesian
mulC (Cartesian x y) n = Cartesian (x * n) (y * n)

point1 :: Cartesian
point1 = Cartesian 8 5

*Main> :load cpd.hs
*Main> mulC point1 3
Cartesian 24.0 15.0

極座標

代数的データ型で

data Polar = Polar Double Double deriving Show

とする。

n倍する

値構築子Polarでパターンマッチする。

mulP :: Polar -> Double -> Polar
mulP (Polar d r) n = Polar (d * n) r

point2 :: Polar
point2 = Polar 6 (pi / 3)

*Main> :reload
*Main> mulP point2 3
Polar 18.0 1.0471975511965976

どっちがどっち

point1をmulPで3倍にしpoint2をmulCで3倍にする。

*Main> mulP point1

<interactive>:X:Y:
Couldn't match expected type Polar with actual type Cartesian
In the first argument of mulP, namely point1
In the expression: mulP point1
*Main> mulC point2

<interactive>:X:Y:
Couldn't match expected type Cartesian with actual type Polar
In the first argument of mulC, namely point2
In the expression: mulC point2

「型が違う」と怒られる。

まとめ

「人間と商品」と同じことを「直交座標と極座標」で復習した。

「人間と商品」へもどる 「点は点だ」へ

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