基本的な構文

7.6 関数定義

二項演算子について

前にちょっと勘違いしていた二項演算子ですが、ここに書いてありましたね。
ここを読んでとても理解が深まりました。


そこでちょっと疑問が…。
二項演算子を定義する、と聞いて連想するのがC++演算子のオーバーライドですが(私だけ?)、
Haskellではもともとある演算子を再定義することが出来るのかな?
と思い、実験的に+演算子を独自に定義してみました。

  • myPlus.hs
main = do print $ 10 + 30

(+) :: Int -> Int -> Int
x + y = 100


ビルドしてみると…

% ghc -W -o myPlus myPlus.hs

myPlus.hs:1:21:
    Ambiguous occurrence `+'
    It could refer to either `Main.+', defined at myPlus.hs:4:2
                          or `Prelude.+', imported from Prelude


なるほど、
私が定義した+演算子かPreludeモジュールで定義されている+演算子のどちらを呼び出せばよいか分からん!
と怒られました。この結果を見ると、オーバーライドは出来ないんですね。
こんな感じでいろいろ遊んでみました。

main = do print $ 10 @+--+@ 30
          print $ (@+--+@) 50 50
          print $ 30 `myPlus` 50
       {- print $ 10 + 30 -}

(@+--+@) :: Int -> Int -> Int
x @+--+@ 0 = x
(@+--+@) x y = x + y

myPlus :: Int -> Int -> Int
x `myPlus` y = x + y

{-
関数のオーバーライドは出来ない!
(+) :: Int -> Int -> Int
x + y = 100
-}