シフトの計算

op (f m,m) [] = [m] であることに注意してもらいたい

op (v,k) ks  =  if v + k == m then k : ks else head ks : ks

での head ks が head [] にならないかという心配があるが vks の一番右の要素での
op は op (f m,m) [] で f m + m == m なので then の方の [m] を返し、それ以降は ks は少なくとも
末尾にこの m という要素が入っていて空リストではないから head ks は大丈夫

という注意。

f k xs の表の見方

2行目の k の列は 1 から m(この例では m = 9)まで順に並んでいる。
1行目はその k に対する f k の値が並んでいる。
1行目の値と2行目の値を足して m(= 9)になる列を調べると
4列、7列、8列、9列である。
3行目の xs の列はその 4,7,8,9 にしたがって 1列から4列までが 4、
5列から7列までが 7、
8列から8列までが 8、
9列から9列までが 9
と並んでいる。