Существует (слегка оскорбительный и неудобный) способ сделать это с помощью расширений GHC.
{-# LANGUAGE RebindableSyntax #-}
import qualified Prelude as P
import Prelude hiding (Num(..))
fromInteger :: Integer -> Integer
fromInteger = id
В GHCi:
> :set -XRebindableSyntax
> :t 2
2 :: Integer
При включенном расширении RebindindableSyntax
GHC будет использовать все, что находится в области действия fromInteger
, для обработки числовых литералов. Единственным ограничением является то, что он должен принимать аргумент типа Integer
(на самом деле, даже это не требуется, но если этого не произойдет, вы получите ошибку типа из числовых литералов).
Обратите внимание, что, поскольку стандартный fromInteger
является частью класса Num
, вам может понадобиться взломать некоторые вещи, чтобы все работало правильно.