bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

ガードをかためて連立方程式を解く

1.場合分け

答えを導くのに、場合分けしたいときが多い。前の記事で説明したパターン照合も一つだが、もう一つの方法にガードがある。今回は連立方程式を解くときに、ガードを用いることとする。

2.連立方程式

連立方程式は、
\begin{align*} ax + bx = c \\ a'x + b'x = c \end{align*}
で表され、そして、二つの式のグラフが並行でないとき解を有する。

解は、\(det = ab' - a'b\)とすると、
\begin{align*} x = (cb'-c'b)/det \\ x = (ac'-a'c)/det \end{align*}

Haskellではガードには「|」を用い、その右側に条件を記述する。その条件を満たした時の関数の本体は、条件の右横に「=」を書き、その後に記述する。そこで、連立方程式の解を求める関数equationをガードを用いて記述すると次のようになる。

equation :: (Eq a, Fractional a) => a -> a -> a -> a -> a -> a -> (a, a)
equation a b c a' b' c' 
  | a * b' /= a' * b = (x, y)
  | otherwise    = error "No solutions."
  where 
    det = a * b' - a' * b
    x = (c * b' - c' * b) / det
    y = (a * c' - a' * c) / det

シグネチャは記述しなければ自動的に生成してくれるが、何をしているかを明確に意識してプログラムを作成したほうが、正しいプログラムを早く完成することができる。最初のうちは、型シグネチャを書くことが億劫であるかもしれないが、型シグネチャを書く癖をつけておくと、後で役に立つ。

3.実行結果

実行結果を下図に示す。
f:id:bitterharvest:20141002205611p:plain
なお、負の数を入力するときはカッコで負の数を囲む。そうしないと、エラーとなる。