haskell-jp / questions #80

実装を見ると、入力値を全て記憶していますね。これはfumievalさんに上で説明頂いた対角化のようです https://www.stackage.org/haddock/lts-15.1/machines-0.7/src/Data.Machine.Mealy.html#driveMealy
ArrowApplyインスタンスが正しく定義できる場合、`k a b` と a -> k () b が同型になるので、ArrowMonadで一般のMealyを表現できます
今日同僚と話して気になったんですが、構文とか、表面的な要素を除いて、型レベルプログラミングにできてTemplate Haskellにできないこと、って何がありますかね。あるのは間違いないんですが、なんかうまく言語化できないので、お知恵を拝借したいです。
一言で表すなら「型に応じて挙動を変えること」ではないでしょうか。Template Haskellは型検査の前にあるので、構文として見えている型が実際は何であるか、既知のデータから推測しかできない一方、型レベルプログラミングなら型に依存した振る舞いを拡張性のある形で表現できます
同型作れるのかこれ……(だんだん不安になる)
ものすごいニッチな質問なのですが、REPL上でTextをプリントする際、.putStrLnよりもRIOが提供しているlogInfoのほうが出力される速度が圧倒的に速いのはなぜだかわかる人いますか。
https://hackage.haskell.org/package/text-1.2.4.0/docs/Data-Text-IO.html#v:putStrLn
https://hackage.haskell.org/package/rio-0.1.14.0/docs/RIO.html#v:logInfo
簡単な例をRepoにしてみました。
https://github.com/HirotoShioi/speed-test
Windows環境でMySQLの接続確認したかったけど、mysql_config not foundの直し方(それらしいSetup.hsかSetup.lhsがみあたらない)がわからないのでPostgresqlで試したら動いたのでよしとするか
https://qiita.com/Lugendre/items/6b4a8c8a9c85fcdcb292 によると 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
そういえば Prelude の putStrLn を使っていたら、出力なしの時よりもかなり遅くなったということがありますね。早い出力方法ってあるんでしょうか
https://github.com/commercialhaskell/rio/blob/b01145fd4df4ee80b39996a04450a764ae8baffa/rio/src/RIO/Prelude/Logger.hs#L349-L362
この部分が、おそらく実際に使われている実装だと思います。その先まではよくわかりませんが。
https://haskell-jp.slack.com/archives/C5666B6BB/p1582882311041200 の質問も含めて、 Utf8Builder というやつが速いから .putStrLn よりも速いんだろうし、 putStrLn の代わりに Utf8Builder とやらを使えば速くなるんじゃないっすかね。
ただこの手のビルダー類、ほかにもいくつか作られていたと記憶しているので、探すのもよいかと。
ビルダーについていろいろ調べてみます。ありがとう!
はい、その同型で c ~ () としたものを考えればいいかと思っていたのですが、 Mealy a b から a -> Mealy () b への関数で、元の情報を落とさないようなものが作れないのです
同型って「型と型のSetとしての同型」の事ではないのだろうか
あるいは、ArrowApplyが扱っているのって要するに冪対象だと思っていて、その同型というのは https://ja.wikipedia.org/wiki/%E5%86%AA%E5%AF%BE%E8%B1%A1#%E5%AE%9A%E7%BE%A9 にあるhomの式だと思うのですが、それをHaskellにエンコードすると arr (b, c) d === arr b (arr c d) が正しくて、右辺の形がちょっと違うのではと
実際、 Mealy (a, b) cMealy a (Mealy b c) で表すのは、まさにMealyのArrowApply(app)の定義がはまりそうな感じがします
圏論に強い人の意見を聞きたいです
a -> b ==> Mealy a b はできるけど Mealy a b ==> a -> b はできないわけで、 as_capabl さんの考察があっているように思います
Idioms are oblivious, arrows are meticulous, monads are promiscuous という論文にこのあたりのことが書かれているらしいです
https://www.stackage.org/haddock/lts-15.1/bytestring-0.10.10.0/Data-ByteString-Builder.html#v:hPutBuilder
hPutBuilder というのが件の関数の中心で使われているんですが、 Handle のバッファを使って Builder を実行するから早いとか書いてありますね。
すみませんよくわかってないのですが、ステートモナドだとなにか過不足があるのでしょうか?
ミーリーマシンをつかうのはなにか回路的な記述をするためでしょうか?
(電子回路をシミュレーションできるかどうかは別として)回路的記述をするためで間違いないです。ステートモナドが一個の値を
繰り返し読み書きするようになっているのに対し、ミーリマシンは入力の列を受け取って出力の列を返すように動きます
単純に State モナドとの違いを挙げるならば、ミーリマシンは、状態を分離および隠蔽して、途中で計算を止めたり再開したりできるという性質を持っています。
私は、このうち Coroutine モナドに似た途中で計算を止めたり再開できるという性質を主に目的にしていました
キーが整数で絶対に直前にinsertしたキー+1しかinsertしないとしてもListとかVectorよりMapとかのほうが良いんでしょうか?
@ has joined the channel
理屈はさておきcriterionなどで計測してみるのが一番確実かと
自分が想像できる範囲では、やり方とかinsertした後の使い方(ランダムアクセスかシーケンシャルアクセスか、とか)に寄るのでは、と思います。
リストだって1個ずつ追加するだけだったら、最後の要素のキーを0と見なして使えば、少なくとも追加する処理はO(1)ですし。
どういうユースケースか存じませんが、List, Vector, Map以外にも有効そうなデータ構造はあると思うので、参考までに https://wiki.haskell.jp/%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E5%88%97%E4%BC%9D もどうぞ
シミュレーターには向いているかもしれないですが
回路の合成を考えると使いにくいですよね
なにかいいフレームワークはありますか?
clashがお手ごろだと思ってます
回路的記述というのはあくまでプログラムを表現する手法を指していて、ClashのようにVerilogなどにコンパイルするという意味ではないと思います
ralパッケージの提供するrandom access list使ってみようと思います
(念のため)回路的記述は私の目的ではないです。
なんでこれが型エラーになるのかがわかりません...(これから寝るのですぐに返信しなくて大丈夫です)
エラーメッセージはこんな感じです
https://downloads.haskell.org/ghc/latest/docs/html/users_guide/glasgow_exts.html#explicit-universal-quantification-forall
Haskell type signatures are implicitly quantified.
なので,`tester :: token -> Bool` の型変数`token` と,`loop`の型変数`token` に実際は何も関係が無いためエラーになります.
https://downloads.haskell.org/ghc/latest/docs/html/users_guide/glasgow_exts.html#scoped-type-variables
で型変数を字句的に一致みるようにすることでも解決できますが,`loop` を tester を受け取るように変更するとか,`loop`の型注釈を省略するなどしたほうが余計な拡張入れずに済むでしょう.
Alternativemany って Parser とか Maybe とかの文脈だと最終的な結果が出るまで生成済みのリストの頭部をクロージャとして丸抱えにするから遅そうに見えるんですけど、実際どうなんでしょう?
行けました、ありがとうございます
LTS Haskellを15.2に上げてstackからGHC 8.2.2をインストールしたところ、多分Template Haskellを使うところで
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'

なるエラーが出るようになったのですが、同じ現象にあった人はいますか?
と、思ったけどよくよく考えてみたら依存パッケージのビルドはできているし、依存パッケージの中でもTH使っていそうだし、THだから必ず発生するというわけでもない?
https://gitlab.haskell.org/ghc/ghc/issues/17575 でしたか...
修正はGHC 8.8.3、と...
ちょいちょいWindows版バグるなぁ... :disappointed_relieved:
こういうの防ぐためにやっぱりちゃんとRC版のうちに試さないとですね...
dyld: Library not loaded: @rpath/libHSdirectory-1.3.6.0-ghc8.8.3.dylib
Referenced from: /usr/local/lib/ghc-8.8.3/bin/runghc
Reason: image not found
なるエラーが出て全然動かないのですが こういうときってどうすればいいんでしょうか?
調べても見つからなくて……
GHC 8.8.3をインストールしてrunghcしたら発生した、ということですよね?
こういうときは単に起きたエラーだけでなく、何をしたら発生したエラーなのか添えていただけると助かります。
(あと、どんな環境で実行したか、などもあるとベター)
で、肝心の問題ですがGHCのバグである可能性は十分あり得ますね... :disappointed_relieved:
同根かは不明ですが https://gitlab.haskell.org/ghc/ghc/issues/17895 という報告もあるので...
対応するとしたらとりあえずGHCの再インストール、ですかね...