Haskell sqrt - преобразование списка целых чисел в числа с плавающей запятой

Мне нужна помощь с моей программой. Предполагается, что sqrt все элементы списка Integer и возвращают список Float в 3 вариантах: 1) рекурсивный, 2) понимание списка, 3) функции высшего порядка. Я написал первый, который отлично работает:

-- recursive:

sqrtL1 :: [Integer] -> [Float]
sqrtL1 [] = []
sqrtL1 (n:ns)  = (sqrt x) : sqrtL1(ns)
    where x = fromIntegral n :: Float

-- Listenkomprehension:

sqrtL2 :: [Integer] -> [Float]
sqrtL2 (n:ns) = [sqrt x | x <- ns]
    where x = fromIntegral n :: Float  --(it doesn't work tho)

-- Higher-order:

sqrtL3 :: [Integer] -> [Float]
sqrtL3 ns = map sqrt ns

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


person user2957781    schedule 18.12.2013    source источник
comment
Обратите внимание, что вам не нужны (и не должны использоваться!) круглые скобки в sqrt x : sqrtL1 ns. В принципе, это все еще правильно, но просто не в красивом стандартном стиле Haskell.   -  person leftaroundabout    schedule 19.12.2013


Ответы (1)


Проблема с sqrtL2 заключается в том, что x не выходит за пределы понимания списка. Вам нужно сделать fromIntegral внутри понимания списка следующим образом:

sqrtL2 ns = [sqrt (fromIntegral x) | x <- ns]

sqrtL3 подходит, за исключением того, что у вас нигде нет fromIntegral, а sqrt - это Floating a => a -> a, поэтому он не работает с Integer. Итак, вам нужно это вместо:

map (sqrt . fromIntegral) ns
person asm    schedule 18.12.2013
comment
Чтобы уточнить, это должно быть просто sqrtL2 ns = [sqrt (fromIntegral x) | x <- ns]. Другими словами, замените (n:ns) на ns и удалите предложение where. - person mhwombat; 18.12.2013