as_capabl
実装を見ると、入力値を全て記憶していますね。これはfumievalさんに上で説明頂いた対角化のようです https://www.stackage.org/haddock/lts-15.1/machines-0.7/src/Data.Machine.Mealy.html#driveMealy
a -> k () b が同型になるので、ArrowMonadで一般のMealyを表現できますarr (b, c) d === b -> arr c d という同型が ArrowApply ならあるらしいので問題ないと思います。というか、下みたいに作れませんかね?(>>=) :: ArrowApply arr => arr a b -> (b -> arr a c) -> arr a c x >>= f = proc a -> b <- x -< a f b -<< a
Utf8Builder というやつが速いから .putStrLn よりも速いんだろうし、 putStrLn の代わりに Utf8Builder とやらを使えば速くなるんじゃないっすかね。c ~ () としたものを考えればいいかと思っていたのですが、 Mealy a b から a -> Mealy () b への関数で、元の情報を落とさないようなものが作れないのですarr (b, c) d === arr b (arr c d) が正しくて、右辺の形がちょっと違うのではとMealy (a, b) c を Mealy a (Mealy b c) で表すのは、まさにMealyのArrowApply(app)の定義がはまりそうな感じがしますa -> b ==> Mealy a b はできるけど Mealy a b ==> a -> b はできないわけで、 as_capabl さんの考察があっているように思いますhPutBuilder というのが件の関数の中心で使われているんですが、 Handle のバッファを使って Builder を実行するから早いとか書いてありますね。Haskell type signatures are implicitly quantified.なので,`tester :: token -> Bool` の型変数`token` と,`loop`の型変数`token` に実際は何も関係が無いためエラーになります.
tester を受け取るように変更するとか,`loop`の型注釈を省略するなどしたほうが余計な拡張入れずに済むでしょう.Alternative の many って Parser とか Maybe とかの文脈だと最終的な結果が出るまで生成済みのリストの頭部をクロージャとして丸抱えにするから遅そうに見えるんですけど、実際どうなんでしょう?ghc.exe: unable to load package `Cabal-3.0.1.0' ghc.exe: | C:\Users\igrep\AppData\Local\Programs\stack\x86_64-windows\ghc-8.8.2\lib\Cabal-3.0.1.0\HSCabal-3.0.1.0.o: unknown symbol `.file'