假設我有很多值得關注的類型爲Word8
,Word16
和Word32
。我想擴大它們,將一些解釋爲已簽名,一些解碼爲未簽名,以便我可以將它們全部存儲在[Int64]
中。我知道我可以寫類似下面的函數,其中第一個參數指定我們是否要解釋Word8
作爲簽署與否:將無符號整數解釋爲在擴展時簽名
convert8 :: Bool -> Word8 -> Int64
convert8 False i = fromIntegral i
convert8 True i = fromIntegral (fromIntegral i :: Int8)
這給了我我想要的結果:
*Main> convert8 False 128
128
*Main> convert8 True 128
-128
儘管如此,雙fromIntegral
對我來說感覺不雅。有沒有更好的方法來說:「將Word
解釋爲一個有符號的整數並且將它放在更大的Int
」?
是否存在'convert8 True = negate的問題。 fromIntegral'? – 2013-04-05 03:14:50
嗯,是的,因爲我不想否定 - 我想將無符號整數解釋爲signed,這意味着例如'convert8 True 1 == 1'。 – 2013-04-05 03:43:21
但我認爲'convert True'意味着你想要一個負值...這樣一個令人困惑的設計!如果布爾值爲「真」,且所需值爲負值,那麼當使用帶符號的類型(即帶符號類型的正值超出範圍)時,該字爲負值? – 2013-04-05 04:02:27