Haskell 整型转换
1) 如何从一种Haskell 整型转换,haskell,types,type-conversion,Haskell,Types,Type Conversion,1) 如何从一种Int类型转换为Num类型 以前也有人问过类似的问题,答案是(在Haskell wiki上)使用from integralfromIntegral返回一个Num类型,因此我必须将其转换为所需的格式 我需要获取一个Word16并将其转换为Int64,因此我将执行以下操作 let valueLength = (fromIntegral(tagLength) :: Int64) 其中tagLength具有类型Word16 这种方法正确吗 2) 如何安全地处理类型转换 来自Java背景
Int
类型转换为Num
类型
以前也有人问过类似的问题,答案是(在Haskell wiki上)使用from integral
fromIntegral
返回一个Num
类型,因此我必须将其转换为所需的格式
我需要获取一个Word16
并将其转换为Int64
,因此我将执行以下操作
let valueLength = (fromIntegral(tagLength) :: Int64)
其中tagLength
具有类型Word16
这种方法正确吗
2) 如何安全地处理类型转换
来自Java背景,我相信整数有Short
,Int
和Long
我可以将short
用作int
,但不能反过来使用。如果我写的话
256 :: Word8
在ghci
中,它返回0
我需要将Word16转换为Int64,以便执行以下操作:
let valueLength = (fromIntegral(tagLength) :: Int64)
这种方法正确吗
让我们问问GHC
Prelude Data.Word Data.Int> :t fromIntegral :: Word16 -> Int64
fromIntegral :: Word16 -> Int64 :: Word16 -> Int64
看起来不错
如何安全地处理类型转换
Haskell没有类型转换。完全所有的“转换”都必须通过编写一个从一种类型“转换”到另一种类型的函数来完成
如果我在ghci
中写入256::Word8
,它将返回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追踪器上提交一个特性请求