我正在学习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
,而是圈数区域计算的浮点数。
答案 0 :(得分:0)
感谢@ Jean-BaptisteYuné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)