some Foo.+++ other
みたいな演算子の感じって、どうなんだろう。慣れれば、まあ「あり」なのかな。
u `Freer.Bind` q
と
u Freer.:>>= q
とだと、どっちのほうがきれいかな。
catは、たとえばheadに行を渡していって、headが終了したら終わるのだけど、どうやってるのかな。
スイッチ2、もり上がっている感じかな。
日経平均がだだ下がりだな。
nostr:note17nz0ap27nqpu4qvktrzvn39pwvnk0q870s66am4vctse3vlpxrnsgld4v0
これ、後で読もう。
extensible effectsの枠組でconduitを作るの、「できない」と思ってたけどできちゃった。
とりあえずgzipを展開する例をちゃんと書いてから、全体を整えてhackageに上げよう。
この処理は、とりあえず「切り分け」てから「正規化」するのがわかりやすいかもしれない。
ここで言う正規化とは、「どこから始めるか」を0から7のあいだにするということ。
つまり、まずは「どこから始めるか」と「ビットの数」だけを計算しておいて、あとから必要なバイトだけにしぼるみたいな感じ。
bitの並びをbyteの並びと、先頭のbyteの「どこから始めるか(0..7)」とbitの数で表現したときに、そのbitの並びを特定の位置で前後に切り分ける処理って、なんかやたらとややこしい。
たとえば
Control.Monad.StateにState型とrunStateがあったとして、
import Control.Monad.Stateとして
StateやrunStateを使うよりも、
Control.Monad.StateにはS型とrunとがあって、
import Control.Monad.State qualified as Stateとして、State.S型やState.runを使うほうが、僕の好みである。
この問題はheadとかtailが「部分関数」であるというよりもやっかいな問題だ。意図に反する動作がしれっと続いていくよりも、どかんと壊れてしまったほうがましなので。
本当なら
take :: Int -> [a] -> Maybe [a]
とか
drop :: Int -> [a] -> Maybe [a]
とかになっていたほうがいい。
今の仕様だと知らないうちに嫌なバグを作り込みそうだ。
Foo a b cみたいな型をFoo' '[a, b, c]みたいな型に変換するようなことって、できないのかな。
おもち
yet another freer effectsでyafeとか