2014-10-11 43 views
1

我知道有沒有「投」在Haskell,但我有這樣的表達:型投在Haskell

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

我想有結果作爲雙。 我想:

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)。過濾奇數。地圖(^ 2)'。 – user2407038 2014-10-11 14:39:35

+0

@ user2407038你應該把它變成一個答案! – Carsten 2014-10-11 14:54:33

+0

@ user2407038非常感謝您的快速和有趣的答案。 – user3166747 2014-10-11 15:33:23

回答

4

如何

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

或者,您也可以在和之前

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

列表中[雙]轉換有哈斯克爾沒有通用的演員,但有功能(如fromInteger和fromRational)可以從一個特定的類型轉換爲所需的類型。 fromIntegral的類型是 fromIntegral :: (Num b, Integral a) => a -> b 它會將積分值轉換爲任何種類的Num值。

+0

非常感謝!這兩種解決方案工作得很好,但是,也許第一個解決方案只有一個地圖更好。 – user3166747 2014-10-11 15:25:50