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'