字句

Haskellの簡単なコードを書いてみようと思った。

myAbs a
  | a<0=-a
  | otherwise=a

main = print(myAbs (-128))

これをそのままコンパイルするとエラーになる。

test.hs:3:2: parse error on input `|'

イコールとマイナスの間に空白を入れるとこのエラーは消える。字句解析の段階で=-がひとつの語であると解釈されてしまうことによってパースに失敗するということらしい。こういった細かなところでハマるので油断できない。
そう言えば、初期のCコンパイラでは=-を-=と同じに解釈するものがあったと聞く。現在と同じ挙動にしたければ空白で区切る必要があったそうだ。C++では山括弧で同種の問題を抱えている。要するにどこまでがひとつのトークンであるかという点が直感に反する場合があるということだ。もちろん、言語設計者もそういった点に無関心ではないと思うが、ユーザーにとってはそれまで使ってきた他の言語の習慣が無意識に定着してしまっていることもあるだろう。今回の例も私がC/C++の感覚から抜けきっていないことが要因のひとつになっていると思う。
直感に反する場合でも、それで一貫していれば誤りにくい。微妙な便宜がかえって混乱の種になったりする。慣れればなんでもないことだとは思うんだけれど。
Document ID: 128b7c4fa0e92709bb061c30aa65a8fd