1)如何将Int
类型转换为Num
类型?
之前已经提出了类似的问题,答案是(就像在Haskell维基上一样)是使用fromIntegral
。 fromIntegral
会返回Num
类型,因此我必须将其转换为我想要的格式。
我需要Word16
并将其转换为Int64
所以我正在执行以下操作
let valueLength = (fromIntegral(tagLength) :: Int64)
其中tagLength
的类型为Word16
这种做法是否正确?
2)你如何安全地处理类型转换?
来自Java背景,其中有整数,我相信Short
,Int
和Long
我可以使用short
作为int
但不是相反。如果我写的话,在Haskell中
256 :: Word8
{p}在ghci
中返回0。
答案 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追踪器上提交功能请求。