如何将Integer * Integer乘法的结果转换为Double?

时间:2016-01-23 11:25:06

标签: haskell type-conversion typeclass algebraic-data-types

我正在学习Haskell,并希望开发我的第一个递归ADT。

我的数据类型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,而是圈数区域计算的浮点数。

1 个答案:

答案 0 :(得分:0)

感谢@ Jean-BaptisteYunés的评论我可以使用fromIntegralfromInteger找到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)