IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

HaskellのshiftLではまった話

数値リテラルで計算すると期待する結果になるけど、なぜかバインドした値を使うと結果が異なり、しばらく悩みました。

 > a
10
 > b
149
 > c
91
 > a `shiftL` 16 .|. b `shiftL` 8 .|. c -- 期待していない結果
91
 > 10 `shiftL` 16 .|. 149 `shiftL` 8 .|. 91 -- これが期待する結果
693595
 >

理由は、型がWord8だからでした。左にシフトしても桁あふれてしまうので、期待した結果になりませんでした。

 > :t a
a :: Word8
 > :t b
b :: Word8
 > :t c
c :: Word8
 >

つまり

c :: Word8
 > (10::Word8) `shiftL` 16
0
 > (149::Word8) `shiftL` 8
0
 >

ということ。