В Haskell могу ли я сделать числовые литералы не полиморфными по умолчанию?

это, вероятно, невозможно, так как я уже проверил список всех расширений GHC, и этого там нет, но я подумал, что спрошу на всякий случай.

есть ли способ сделать так, чтобы 2 типа Int (или Integer), а не обычный Num a => a?

(причина, по которой я хотел бы это поведение, заключается в том, что оно делает сообщения об ошибках более ясными и вывод типа более вероятным (esp с классами типов). Я всегда мог написать (2::Int) везде, но я бы скорее" более безопасное " поведение будет менее явным)

2 ответов


есть (немного оскорбительный и неудобный) способ сделать это с помощью расширений 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 is часть Num класс, вам может потребоваться взломать некоторые вещи, чтобы все работало правильно.


Я думаю, что должен добавить "default()" к этим ответам, хотя я думаю, что gatoatigrado упомянул об этом мимоходом. Стандарт Haskell 98 имеет 4.3.4, которая в конечном итоге описывает, как изменить некоторые умолчанию Num a => a значения. Неявный порядок дефолта задается

 default (Integer, Double)

и может быть изменен, например, поставив

 default (Int)

или

 default ()

в исходном файле.