Real World Haskell Chapter 3: EXERCISE 10 - 13
第3章の EXERCISE 10 から 13 を解いてみたくなったので、やってみる。2次元平面上の3点、a, b, c を考え、a → b、b → c という 2 つの線分が作る角は右に折れるか、左に折れるか、真っ直ぐか、という問題。
図にすると、こう。
……タッチパッドで頑張って描きました。
EXERCISE 10. は、方向を表す型、Direction を定義せよ、という問題。
まぁ、こうですよね。
data Direction = LeftTrun | RightTurn | Straight
真っ直ぐ戻る、という場合も考えないとダメなのかなぁ?
EXERCISE 11. 3 つの点をとって、Direction を返す関数を定義せよ。
との比、との比に注目します。これらが等しくなるとき、2つの線分は真っ直ぐ並びます。図のようになら左折、逆なら右折です。多分。
なので、
direction (ax, ay) (bx, by) (cx, cy) | dx_cb * dy_ba < dx_ba * dy_cb = LeftTrun | dx_cb * dy_ba > dx_ba * dy_cb = RightTurn | dx_cb * dy_ba == dx_ba * dy_cb = Straight where dx_ba = bx - ax dx_cb = cx - bx dy_ba = by - ay dy_cb = cy - by
まんま書いて、こう。
EXERCISE 12. は点のリストをとって、Direction のリストを返す関数を定義せよ、という問題。
……なんか、飽きてきたな。
directions (a:b:c:[]) = [direction a b c] directions (a:b:c:rest) = (direction a b c):(directions (b:c:rest))
で、13. が本題、…なんでしょうが、もう遅いし、寝ます。
気が向いたら、続きを書く、かも。