Haskellで+演算子、-演算子と同じ動きの演算子を再定義しようと思い立つ 0 +^ n = n m +^ 0 = m m +^ n = 1 + m +^ (n - 1) +演算子と-演算子使っちゃってる・・・ 0 -^ n = n m -^ 0 = m m -^ n | m == n = 0 m -^ n = 1 -^ n -^ (m -^1) を定義して・・・ +^の一番下の定義をこう書き換える n +^ m = 1 +^ n +^ m -^ 1 いつまで経っても、0 +^ n, m +^ 0のパターンが現れず、無限再帰 1 +^, 1 -^は1を生成するだけで、1を足したり、引いたりはしてくれない… 1を足す。1を引く。という「演算」を行う関数が必要だ ・・・どう作れば良いねん 数字の構造から再定義するか? 続く
21 :
data NaturalNum = Zero | PlusOne NaturalNum deriving (Eq, Ord, Show, Read) -- 自然数 = ゼロ or ひとつ足す 自然数 (自然数とは、ゼロと、自然数にひとつ足したもの 注:ゼロは自然数) これで、 0 = Zero 1 = PlusOne Zero 2 = PlusOne (PlusOne Zero) という具合に数字として動く「何か」は表現できるようになった +^,-^演算子をNaturalNum型に合わせて書き換えてみよう Zero +^ n = n m +^ Zero = m m +^ n = inc m +^ dec n Zero -^ n = n m -^ Zero = m m -^ n | m == n = Zero m -^ n = dec m -^ dec n 問題はinc関数、dec関数だな… まあ、inc関数は単純にxを受け取って、PlusOneを被せればいいだろう inc x = PlusOne x 続く
22 :
問題は、dec関数・・・か 1を引くって、どうやるんだ? xを受け取って…? どうすんだよ… ようするに、PlusOneを外せばいいんだよな… あ、そうか!! PlusOneを被った何かを受け取って、PlusOneを剥がした状態を返せばいいんだ!!! こうか!! dec (PlusOne x) = x かくして、図らずも自然数の構造を見てしまった今日この頃 いや、思はぬ発見に興奮中なの・・・