チェックサムの計算を目指した何か

30分プログラム、その749。チェックサムの計算をしようといて失敗しました。
wikipedia:チェックサムによると、チェックサムは「各ワードの合計の下位nビット」の合計として定義されています。
が、これを勘違いして「全ワードの合計の下位nビット」だと思ってコードを書いてしまいました。でも、せっかく書いたので貼っておきます。
SMLでビット演算する方法がわからず結構調べました。ホームページ移転のお知らせ - Yahoo!ジオシティーズによるとWordストラクチャを使えばできるらしいです。

使い方

- checksum 8 [1,2,3];
val it = 0wx6 : word

ソースコード

open Word;
infix 6 << andb;

fun mask n =
    (0wx1 << (Word.fromInt n)) - 0wx1;

fun add mask (x,y) =
    (x + y) andb mask;

fun checksum bits xs =  List.foldl (add (mask bits)) 0wx0 (List.map Word.fromInt xs);

(* from wikipedia(ja) *)
val test = checksum 8 [
	   0x08,0x09,0x0A,0x0B,0x0C,
	   0x0D,0x0E,0x0F,0x00,0x01,
	   0x02,0x03,0x04,0x05,0x06,
	   0x07
	   ];