ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

GHCIで「parse error on input `='」

parse error on input `='

GHCiでHaskellを書いているとなぜかこのようなエラーが出ます。
対策ですが、とりあえず数値や関数を定義するとき、行頭に「let」を書いておくと出ません。
なんでかは知りませんが…
haskell - Hakell error parse error on input `=' - Stack Overflow
だそうです。
閑話休題。
今回は試しにアッカーマン関数を書いてみたのですが、わずか3行で書くことができました。やっぱりこういうのにはめっぽう強いですね。

ack :: Int -> Int -> Int
ack 0 n = n + 1
ack m 0 = ack (m - 1) 1
ack m n = ack (m - 1) (ack m (n - 1))

パターンマッチを使うと関数の定義式をそのまま書き写したかのような記述で実装することができていい感じです。ちなみに定義式は以下のとおり。

Ack(m, n) = \left{ \begin n + 1 (m = 0)\\ Ack(m - 1, 1) (n = 0)\\ Ack(m-1, Ack(m, n - 1)) (otherwise) \right}

まあそのまんまですねw


ちなみにこのアッカーマン関数、ちょっと引数を間違えるだけで恐ろしく大きな数になる*1ので気をつけましょう。Ack(4,1)は65336-3ですが、Ack(4,4)は{{{{2^2}^2}^2}^2}^2}^{2}-3*2とかいう頭おかしい数です。すでにAck(4,2)の時点で約2万桁あるという…

*1:とくにmが大きいとき

*2:2を7回2乗して3引いた数。桁数?しらない