类型转换如何在Haskell中工作?

时间:2017-03-11 04:50:47

标签: haskell casting

我希望能够以与您在Java中类似的方式截断floatdouble(int)5.583

我做了一些研究,据我所知,Prelude中没有任何内容可以导入。所以我想知道如何构建一个能够完成它的函数。我想也许如果我做了show 5.583然后将子字符串带到小数点然后将其转换为Int,但这似乎只在使用递归时非常低效。那么有更简单的方法吗?

2 个答案:

答案 0 :(得分:7)

  

我希望能够截断floatdouble

令人欣喜的是,将小数截断为积分的函数命名为" truncate"。

https://www.stackage.org/haddock/lts-8.4/base-4.9.1.0/Prelude.html#v:truncate

λ> truncate 5.583
5

其类型是

truncate :: (Real a, Fractional a, Integral b) => a -> b

这只是一个普通的功能。 Haskell没有任何语言功能(或kludge,如果你愿意的话)类似于Java中的类型转换。

答案 1 :(得分:2)

使用ghc转换浮点数是可能的:

λ> :m GHC.Float
λ> :t float2Double
float2Double :: Float -> Double
λ> :t double2Float
double2Float :: Double -> Float
λ> :t double2Int
double2Int :: Double -> Int
λ> :t float2Int
float2Int :: Float -> Int
λ> :t int2Double
int2Double :: Int -> Double
λ> :t int2Float
int2Float :: Int -> Float

但是对于整数的浮点数,我建议使用ceilingroundfloor以及fromIntegral进行反向转换。

编辑:在仔细阅读问题之后,@ Chris Martin的回答是正确的:

λ> :t truncate
truncate :: (Integral b, RealFrac a) => a -> b