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