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

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

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

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

Ответы [ 2 ]

14 голосов
/ 25 июля 2011

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

4 голосов
/ 26 июля 2011

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

 default (Integer, Double)

и может быть изменен, например, путем помещения

 default (Int)

или

 default ()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...