たとえば、
foo = do
[x, y, z] <- pure $ take 3 xs
みたいなコードを書いたっていいわけで、これは人間の目で見てfailになることはないのだけど、ちょっと気持ちが悪くもある。
でもプログラミングをしていると、こういう類の気持ち悪さをある程度許容しなくちゃならないことがある。
字面の美しさ、アルゴリズムの美しさ、効率、安全性といったいくつものパラメーターのなかでバランスを取る作業というのがプログラミングにはある。そこには楽しさと気持ち悪さとが共存している。
たとえば、
foo = do
[x, y, z] <- pure $ take 3 xs
みたいなコードを書いたっていいわけで、これは人間の目で見てfailになることはないのだけど、ちょっと気持ちが悪くもある。
でもプログラミングをしていると、こういう類の気持ち悪さをある程度許容しなくちゃならないことがある。
字面の美しさ、アルゴリズムの美しさ、効率、安全性といったいくつものパラメーターのなかでバランスを取る作業というのがプログラミングにはある。そこには楽しさと気持ち悪さとが共存している。
で、今書いてるdeflateのコードで言うならば、渡すデータがバイトの境界をまたぐかまたがないかで、Either BitArray ByteStringみたいなデータ構造でLeftかRightかを渡すようにしておいて、受け取る側では
Right bs <- get
みたいな形で、「人間はこれが失敗しないことを知っている」というコードの書きかたをするというのが、ひとつの妥協点かな、と。
さらに進めると、前段と後段のあいだに、Either BitArray ByteStringを受け取って、ByteStringを渡すみたいな処理を入れておいて、もしLeftが来たらエラーをthrowするようにするのもありかもしれない。
前段と後段に入れるRightでなかったときに例外を発生させるパイプを定義した。まだ使ってないので動くかどうかはわからない。