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
,