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 >
ということ。