>>594
ちなみにsplitAtのやり方だとtake n zsの一番最後が更新したい場所になるので、initした上で++[a]++ysする必要がある。

setAt n a zs = init xs ++ [a] ++ ys
.........................where (xs, ys) = splitAt zs

Haskellでswap関数を作る7つの方法とか言うページ思い出したわ。。。