Int类型转换

时间:2013-03-17 13:34:21

标签: haskell types type-conversion

1)如何将Int类型转换为Num类型?

之前已经提出了类似的问题,答案是(就像在Haskell维基上一样)是使用fromIntegralfromIntegral会返回Num类型,因此我必须将其转换为我想要的格式。

我需要Word16并将其转换为Int64所以我正在执行以下操作

let valueLength = (fromIntegral(tagLength) :: Int64)

其中tagLength的类型为Word16

这种做法是否正确?

2)你如何安全地处理类型转换?

来自Java背景,其中有整数,我相信ShortIntLong 我可以使用short作为int但不是相反。如果我写的话,在Haskell中

256 :: Word8
{p}在ghci中返回0。

1 个答案:

答案 0 :(得分:21)

  

我需要使用Word16并将其转换为Int64,所以我正在执行以下操作:

let valueLength = (fromIntegral(tagLength) :: Int64)
     

这种做法是否正确?

让我们问GHC!

Prelude Data.Word Data.Int> :t fromIntegral :: Word16 -> Int64
fromIntegral :: Word16 -> Int64 :: Word16 -> Int64

看起来不错。

  

如何安全地处理类型转换?

Haskell没有类型转换。完全没有。所有"转换"必须通过编写一个"转换"从一种类型到另一种类型。

  

如果我在256 :: Word8中写ghci,则会返回0

数字文字是多态的。对于没有小数点的内容,隐式使用fromInteger

Prelude> :t 256
256 :: Num a => a
Prelude> :t fromInteger
fromInteger :: Num a => Integer -> a
Prelude> fromInteger (256 :: Integer) :: Word8
0

如果有一个单一类型的数字文字的警告或某些东西超出了该类型的范围,那可能会很好;也许你应该在GHC的bug追踪器上提交功能请求。