【问题标题】:How to convert the result of an Integer * Integer multiplication to Double?如何将 Integer * Integer 乘法的结果转换为 Double?
【发布时间】:2016-01-23 11:25:06
【问题描述】:

我刚刚学习 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,而是一些用于圆面积计算的浮点数。

【问题讨论】:

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


【解决方案1】:

感谢@Jean-Baptiste Yuné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)

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多