Ошибка Haskell: не Мог соответствовать ожидаемому типу 'Целое число' против выведенного типа 'Интервал'

У меня есть функция haskell это, которое вычисляет размер списка конечного Ints. Мне нужен выходной тип, чтобы быть Целым числом, потому что значение на самом деле будет больше, чем максимум, связанный Интервала (результат будет-1, чтобы быть точным, если выходным типом будет Интервал),

size :: a -> Integer
size a =  (maxBound::Int) - (minBound::Int)

Я понимаю различие между (ограниченным) Ints и (неограниченными) Целыми числами, но я хотел бы сделать Целое число из Интервала. Я задавался вопросом, была ли функция как fromInteger, который позволит мне преобразовывать Интервал в Целый тип.

5
задан Don Stewart 18 April 2011 в 22:27
поделиться

3 ответа

Вам нужно будет преобразовать значения в Integers, что можно сделать с помощью функции fromIntegral (числовое приведение для Haskell):

fromIntegral :: (Integral a, Num b) => a -> b

Она преобразует любой тип из класса Integral в любой тип из (более крупного) класса Num. Например,

fromIntegral (maxBound::Int) - fromIntegral (minBound::Int)

Однако я бы не очень доверял вашему подходу - он кажется очень хрупким. Поведение в присутствии типов, допускающих обертывание, довольно подозрительно.

Что вы на самом деле имеете в виду под: "размер списка конечных Ints". Что такое размер в этом смысле, если это не длина списка?

11
ответ дан 18 December 2019 в 11:55
поделиться

Возможно, вы предполагали, что в Haskell, как и во многих основных языках, таких как C и (в некоторой степени) Java, есть неявные числовые принуждения. Это не так: Int и Integer - совершенно не связанные типы, и для преобразования между ними существует специальная функция: fromIntegral. Она принадлежит к классу типов Num. Посмотрите документацию: по сути, fromIntegral делает нечто большее: она является родовой "построить представление произвольного интегрального числа", т.е. если вы реализуете какой-то тип чисел и инстанцируете Num, вы должны обеспечить способ построения интегральных чисел вашего типа. Например, в экземпляре Num для комплексных чисел функция fromIntegral создает комплексное число с нулевой мнимой частью и целой действительной частью.

Единственный смысл, в котором Haskell имеет неявные числовые принуждения, заключается в том, что целочисленные литералы перегружены, и когда вы пишете 42, компилятор неявно интерпретирует это как "fromIntegral (42::Integer)", поэтому вы можете использовать целые числа в любых контекстах, где требуется тип Num.

0
ответ дан 18 December 2019 в 11:55
поделиться

Я думаю, вы ищете:

fromIntegral :: (Integral a, Num b) => a -> b

, который преобразует целое число в Int

4
ответ дан 18 December 2019 в 11:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: