Haskell

Haskell で (a == 1 && a == 2 && a == 3) を真にする

Stack Overflow の記事 Can (a ==1 && a== 2 && a==3) ever evaluate to true?
が元ネタらしい。

このコードは数字を全て a と同じ値としてしまうという方針です。

-- >>> main 
-- True
main :: IO ()
main = print (a == 1 && a == 2 && a == 3)

-- `A == A = True` となる普通の Eq インスタンスも導出する
data A = A deriving (Eq)

a :: A
a = A

instance Num A where
  -- `A` 型の整数リテラルは全て値 `A` として読む
  fromInteger _ = A
  -- のこりのメソッドはいらないので単に `undefined` にする
  (+) = undefined
  (*) = undefined
  abs = undefined
  signum = undefined
  negate = undefined