2016-01-23 124 views
1

我剛剛學習Haskell,並希望開發我的第一個遞歸ADT。如何將Integer * Integer乘法的結果轉換爲Double?

我的數據類型Figure應該能夠表示矩形和圓的任意組合,並且方法area應該計算圖的總面積(忽略重疊)。

問題是,對於例如矩形,寬度和高度爲Integer,而面積的結果應爲Double(或至少一個浮點數)。

data Figure = Rect { x :: Integer, y :: Integer, width :: Integer, height :: Integer} 
      | Circle { x :: Integer, y :: Integer, radius :: Integer} 
      | CombiFigure Figure Figure 
      deriving (Eq, Read, Show) 

area :: Figure -> Double 
area (Rect _ _ w h) = (w * h) -- Integer * Integer, does not work 
area (Circle _ _ r) = (pi * r * r) -- (Floating a => a) * Integer * Integer, does not work 
area (CombiFigure first second) = (area first) + (area second) -- Double * Double, works 

你能給我一個方向如何解決這個問題嗎?結果是Double並不是強制性的,但是用於圓區域計算的一些浮點數。

+3

看到https://wiki.haskell.org/Converting_numbers –

回答

0

感謝@讓 - 巴蒂斯特Yunés的評論我能夠通過使用fromIntegral解決這個和fromInteger發現here

data Figure = Rect { x :: Integer, y :: Integer, width :: Integer, height :: Integer} 
      | Circle { x :: Integer, y :: Integer, radius :: Integer} 
      | CombiFigure Figure Figure 
      deriving (Eq, Read, Show) 

area :: Figure -> Double 
area (Rect _ _ w h) = (fromIntegral w * fromIntegral h) -- Method 1: using fromIntegral 
area (Circle _ _ r) = (pi * fromInteger r * fromInteger r) -- Method 2: using fromInteger 
area (CombiFigure first second) = (area first) + (area second)