6 / 2 (1 + 2)

というので、えらそうに
と答えてみたんだけれど、
という疑問が浮かび、 Haskell で確かめられるんじゃね?
と。

もちろん 2 3 なんて計算はできないので(数を関数に見立てて数に適用する、ということは無理)、どうにかならないかなあ、と。
どうにかしてみた。

-- mynum.hs
data N a = N a | Add | Mul | Div | Ad a | Mu a | Di a deriving (Show)

apply (N a) (N b) = N (a * b)
apply (N a) Add = Ad a
apply (Ad a) (N b) = N (a + b)
apply (N a) Mul = Mu a
apply (Mu a) (N b) = N (a * b)
apply (N a) Div = Di a
apply (Di a) (N b) = N (a / b)
$ ghci mynum.hs
*Main> apply (apply (N 6) Div) (apply (N 2) (apply (apply (N 1) Add) (N 2)))
N 1.0

つまりなんだ、 6 / (2 (1 + 2)) という計算式を立てて計算すると答えは 1 になるよ、と。

まあそりゃあそうだね。結合順序を括弧で明示しているからね。

(6 / 2) (1 + 2) という式なら apply (apply (apply (N 6) Div) (N 2)) (apply (apply (N 1) Add) (N 2)) という表現になり、これを計算させると結果は N 9.0。

あたりまえだね。結合順序を括弧で明示しているからね。


というわけで数字と数字を並べた場合は乗算を適用するというルールを追加した数値の計算の世界をつくりあげたとして、じゃあ、乗算記号を省略した乗算の結合優先度をどうするか、ということも決めておかないと計算の結果は決められないってことだ。

あ、ところで、先の計算方法に、乗除算は加算に優先するっていうルールを apply の中に封じ込めることって、できるのかな?