如何转换 - >浮动?

时间:2012-01-08 10:35:48

标签: haskell

我认为我可以使用fromEnum作为 - > Int但是我怎么做 - >浮动。我需要我的变量是一个Float我的功能,但我无法弄清楚如何转换它?我已经阅读了Prelude,看不到任何可行的东西。对不起,如果这是一个非常愚蠢的问题,但我刚刚开始。

3 个答案:

答案 0 :(得分:9)

这取决于 a 是什么。如果 a 是Integral的实例,例如IntInteger,则可以使用

fromIntegral :: (Integral a, Num b) => a -> b

如果 a 是Real的实例,如Rational或Double,则可以使用

realToFrac :: (Real a, Fractional b) => a -> b

还有fromIntegralrealToFrac所基于的Integer和Rational的特殊函数:

fromInteger :: (Num a) => Integer -> a
fromRational :: (Fractional a) => Rational -> a

如果 a 是Enum的一个实例(因此您可以使用fromEnum,正如您所说的那样),那么fromIntegral . fromEnum应该这样做。 fromEnum a 转换为Int,然后fromIntegralInt转换为Float,以便fromIntegral . fromEnum转换 a Float

答案 1 :(得分:1)

您可以先将(Enum a) => a转换为Int,然后将Int转换为Float。要将Int转换为Float(或许多其他数字类型),请使用fromIntegral。结合这两个函数的函数是:

floatFromEnum :: (Enum a) => a -> Float
floatFromEnum = fromIntegral . fromEnum 

编辑:请注意,fromEnum不适用于任何a,正如您所暗示的那样,但仅适用于a的{​​{1}} { {1}}个实例。

答案 2 :(得分:0)

您是否尝试使用fromIntegral功能?

fromIntegral :: (Integral a, Num b) => a -> b

我刚刚在ghci中对其进行了测试,而以下代码无效(错误类型):

> let a = 1::Int
> let b = 1::Float
> a + b
Couldn't match expected type `Int' against inferred type `Float'....

如果你使用fromIntegral,它就可以了:

> let a = 1::Int
> let b = 1::Float
> (fromIntegral a) + b
2.0