2014-10-11 2 views
1

Я знаю, что нет «слепка» в Haskell, но у меня есть это выражение:Тип отлит в Haskell

o = sum . takeWhile (< 10000) . filter odd . map (^2) $ [1..] 

Я хотел бы иметь результат в виде Double. Я пробовал:

g :: (Integral c, Double b) => [c] -> b 
g =sum . takeWhile (< 10000) . filter odd . map (^2) 

и другие вещи, как ... Я всегда получаю сообщение об ошибке. Как я могу это сделать?

+2

«Двойной» тип, а не тип. Правильной сигнатурой типа является 'g :: Integral c => [c] -> Double' или более общий' g :: (Num a, Integral c) => [c] -> a' В общем, вы можете использовать 'fromIntegral' для преобразования любого интегрального типа в любой другой числовой тип:' g = fromIntegral. сумма. takeWhile (<10000). фильтр нечетный. map (^ 2) '. – user2407038

+0

@ user2407038 вы должны сделать это в ответ! – Carsten

+0

@ user2407038 Большое спасибо за быстрый и интересный ответ. – user3166747

ответ

4

Как насчет

g :: [Integer] -> Double 
g = fromInteger . sum . takeWhile (< 10000) . filter odd . map (^2) 

Или, вы можете преобразовать список в [Double] перед суммой по

g = sum . map fromInteger . takeWhile (< 10000) . filter odd . map (^2) 

Там нет общего отлитый в Haskell, но есть функции (например, fromInteger и fromRational), которые могут конвертировать из определенного типа в желаемый тип. Тип fromIntegral - fromIntegral :: (Num b, Integral a) => a -> b Он преобразует интегральное значение в любое значение Num.

+0

Большое спасибо! Эти два решения работают очень хорошо, но, может быть, первый из них лучше всего с одной картой. – user3166747

Смежные вопросы