6ビットASCIIをバイナリ形式に変換するための次のプログラムがあります。
ascii2bin :: Char -> B.ByteString
ascii2bin = B.reverse . fst . B.unfoldrN 6 decomp . to6BitASCII -- replace to6BitASCII with ord if you want to compile this
where decomp n = case quotRem n 2 of (q,r) -> Just (chr r,q)
bs2bin :: B.ByteString -> B.ByteString
bs2bin = B.concatMap ascii2bin
これにより、次のコアセグメントが生成されます。
Rec {
$wa
$wa =
\ ww ww1 ww2 w ->
case ww2 of wild {
__DEFAULT ->
let {
wild2
wild2 = remInt# ww1 2 } in
case leWord# (int2Word# wild2) (__word 1114111) of _ {
False -> (lvl2 wild2) `cast` ...;
True ->
case writeWord8OffAddr#
ww 0 (narrow8Word# (int2Word# (ord# (chr# wild2)))) w
of s2 { __DEFAULT ->
$wa (plusAddr# ww 1) (quotInt# ww1 2) (+# wild 1) s2
}
};
6 -> (# w, (lvl, lvl1, Just (I# ww1)) #)
}
end Rec }
に注意してord . chr == id
ください。したがって、ここには冗長な操作があります。narrow8Word# (int2Word# (ord# (chr# wild2)))
GHCが不必要にInt->Char->Intから変換している理由はありますか、それともこれは不十分なコード生成の例ですか?これを最適化できますか?
編集:これはGHC 7.4.2を使用していますが、他のバージョンでコンパイルしようとしたことはありません。それ以来、問題はGHC 7.6.2に残っていることがわかりましたが、冗長な操作はgithubの現在のHEADブランチで削除されています。