我认为我可以使用fromEnum作为 - > Int但是我怎么做 - >浮动。我需要我的变量是一个Float我的功能,但我无法弄清楚如何转换它?我已经阅读了Prelude,看不到任何可行的东西。对不起,如果这是一个非常愚蠢的问题,但我刚刚开始。
答案 0 :(得分:9)
这取决于 a 是什么。如果 a 是Integral的实例,例如Int
或Integer
,则可以使用
fromIntegral :: (Integral a, Num b) => a -> b
如果 a 是Real的实例,如Rational或Double,则可以使用
realToFrac :: (Real a, Fractional b) => a -> b
还有fromIntegral
和realToFrac
所基于的Integer和Rational的特殊函数:
fromInteger :: (Num a) => Integer -> a
fromRational :: (Fractional a) => Rational -> a
如果 a 是Enum的一个实例(因此您可以使用fromEnum
,正如您所说的那样),那么fromIntegral . fromEnum
应该这样做。 fromEnum
将 a 转换为Int
,然后fromIntegral
将Int
转换为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