Haskell, как добавить число с плавающей точкой для всех членов целочисленного списка

Я новичок в Haskell, но я пытаюсь добавить число с плавающей запятой ко всем членам целочисленного списка в Haskell, и у меня возникают проблемы с преодолением ошибок и тому подобного.

В принципе

addAll xs = map (+3.5) xs

Где xs - список целых чисел.

2 ответа

Вам нужно будет конвертировать каждый Integer к Float прежде чем вы сможете добавить Float к этому.

Ты можешь использовать fromInteger за это. Его тип

Num a => Integer -> a

который для нашей цели здесь специализируется на

Integer -> Float

Так вот что addAll функция выглядит так:

addAll :: [Integer] -> [Float]
addAll xs = map (\x -> fromInteger x + 3.5) xs

Пример использования в GHCi:

λ> addAll [1, 2, 3]
[4.5,5.5,6.5]

Что вы ожидаете от списка результатов?

Может быть [Float] или же [Integer] - В Хаскеле вы должны быть откровенны об этом.

1. [Integer]

Вам нужно либо round число с плавающей запятой перед умножением:

map (+ (round (3.5 :: Float))) [1..(10 :: Integer)]

2. [Float]

Или конвертировать целые числа с fromInteger

[3.5 + fromInteger x | x <- xs]
map ((+3.5) . fromInteger) xs

добавление чисел работает только в том случае, если оба слагаемых имеют одинаковый тип, вы можете увидеть это в сигнатуре типа

(+) :: Num a => a -> a -> a

все a должны быть одинаковыми и быть экземпляром Num -typeclass (очень похоже на интерфейс в Java, если у вас есть опыт работы с этим).

Примечание: в Haskell 1 нет автоматического преобразования.

1: за исключением числовых литералов, таких как 0,1,2… они конвертируются с использованием fromInteger , числовые литералы как 1.1 , 2.2 и т. д. конвертируются fromRational а также String литералы при включении OverloadedStrings с fromString ,

Другие вопросы по тегам