haskell-jp / ghc8x #3

Windows + stack %USERPROFILE%/AppData/Local/Programs/stack/x86_64-windows/ghc-8.4.4/lib/settings
(PPL、去年は1月22日だった、登録開始 https://jssst-ppl.org/workshop/2018/)
~/AppData/Local/Programs/stack/x86_64-windows/ghc-8.4.4/mingw/bin15:28$
> ./ld.exe -V
GNU ld (GNU Binutils) 2.29.1
  Supported emulations:
   i386pep
   i386pe
~/AppData/Local/Programs/stack/x86_64-windows/ghc-8.4.4/mingw/bin15:29$
> ./ld.gold.exe -V
GNU gold (GNU Binutils 2.29.1) 1.14
  Supported targets:
   elf32-iamcu
   elf32-i386
   elf32-i386-freebsd
   ... 以下略 ...

全部ELFだね。。。 :disappointed:
今日の MonadPlus IO の話が出たときの Parsec の話。

やはり Parsec の (p <|> q) でも、
p が失敗したときに入力を消費していないことが、
q を実行する条件。
p が失敗したときに入力を消費しているときには、 (p <|> q) が失敗する。
なので、Parsec では effect が中途半端に実行されて実行が続いてしまうことは起こらない。

http://hackage.haskell.org/package/parsec-3.1.13.0/docs/Text-Parsec.html#v:-60--124--62-

私の記憶違いではなかったらしい。
なのでどこかで try で捕まえなければ、結果的に全体が失敗する。
間違えた https://mail.haskell.org/pipermail/haskell-cafe/2018-August/129829.html のようです。
そしてmegaparsecも日比野さんの仰る実装のようです。 :relieved:
http://hackage.haskell.org/package/megaparsec-7.0.4/docs/Text-Megaparsec.html#v:try
よく意味がわかってませんですみませんでした。。。
バックトラックしたい箇所だけ選んで try を入れることで無駄なバックトラックを減らして効率化する方式なんですね。
hasmoku でも話題にしたことがあるけど、
p *> q <|> p *> r === p *> (q <|> r)

MonadPlus(Alternative) の分配法則が成立しないの、
プログラム書きづらいと思うんですよね。
そこは。。。そんなにAlternativeでのコンビネーターを書くことがないのでやっぱりピンとこないです。。。書いたとしても、特定のインスタンス向けのものしか意識しません。。。 :disappointed:
むしろ、途中まで effect が実行された方が嬉しい例というのがあれば見てみたい。
次の勉強会ネタで、fumi くんが「GHC 8.8の機能」と言って、僕が「まだリリースされてないと思うよ」と言ってしまいましたが、よく考えるとリリースされてなくてもいいですね。
途中で仕様が変わったのかと思い、最初である parsec 2.0 のコードを読んでみましたが、その時点で @khibino さんの説明通りに実装されていることを確認しました。
For reasons of speed, the (<|>) combinator is predictive; it will only try its second alternative if the first parser hasn't consumed any input. Consider the following example parser:
おお、もっと前からだ。
wai-app-file-cgi では、たとえば index.html.ja、index.html の優先順位でファイルを返答するときに、両者を読み込むコードは全く独立で、最初がエラーになったら次のアクションに行くという作りになっています。
IO は Alternative にすべきではないという意見があったので、io-choiceというパッケージを作って使っています。
遅くなりましたが私の資料も上げておきました。
http://the.igreque.info/slides/2018-12-07-ghc8x.html#(1)
@khibino さんが言うように、GHC 8 以降は IO が Alternative になっていて、実装を読んでみたら io-choice と一緒だった。io-choice は obsoleted でいいかな?
@maoe 高速な pure Haskell integer ライブラリって、どれのことでしょうか?
ありがとう!
補足ですがpure HaskellではなくC bindingです
libcryptoというライブラリーを使っているので実際にはPure Haskellではないですが、libgmpのような、ライセンスの都合上での面倒ごとがない、ということでしたよね?
NamedFieldPuns と RecordWildCards ついて調べました。
NamedFieldPuns は x=x の代わりに x と書ける。
RecordWildCards は、x=x の代わりに .. と書ける。
のようです。
Record{x} は NamedFieldPuns
Record{..} は RecordWildCards
Record{x,..}は、NamedFieldPuns + RecordWildCards
です。

以前は、Record{..}を多用していたのですが、どのフィールドを使っているのかよく分からないから明記しろという指令が下りましたので、Record{x,z} のように書くようになりました。

なので、RecordWildCards が減り NamedFieldPuns が増えました。
インターンが来たら、libgryptoを参考に、 を完成させることにします。
index.html.ja、index.html の優先順位でファイルを返答するときに

この例だとファイルの読み込みが
副作用の痕跡を残さないことを
暗黙に期待している例になっていると思うので、
実は effect が途中まで実行されて嬉しい例にはなっていないと思います。
IO の MonadPlus のインスタンスですが、
マニュアルに書いてある MonadPlus の満たすべき性質の 2つめ

v >> mzero = mzero


を満たせていないですね。

http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Monad.html#t:MonadPlus
これが満たされるときには、
連続実行の後に失敗があれば、
それは何もしなかったのと同じになる。

おそらくこのときには分配法則も成立する。
Simon さんが STM のプレゼンで、
ミサイル発射しちゃったら巻き戻せない、
みたいな例を挙げていたのを思い出しました。
ミサイルが発射されないように使えばOK。
io-choice をやめて Alternative IO にした mighty を http://www.mew.org/ で動かし始めました。
何かおかしければ教えて下さい。
https で話しかけると、TLS 1.3 (hs-tls の master) を喋ります。
もう10日以上経ったけど、簡単に記事書きました
何か間違ってたら突っ込んでください :bow:
https://matsubara0507.github.io/posts/2018-12-18-ghc8x.html
FYI. 例のinteger-opensslについての議論によると、libtommathというのも検討しているそうです。
https://www.libtom.net/
https://github.com/ghc-proposals/ghc-proposals/pull/183#issuecomment-440629129
well-typed の研修を受けるという話はどうなっているでしょうか? うちの締めは3月末です。
@kilo has joined the channel
@aiya000 has joined the channel
@kazu DM を送りましたので、まずはそちらを見ていただけますでしょうか?
@kayhide あー、すいません。通知の来ない時間のDMだったようで、まったく気づいていませんでした。
今からだと、ちょっと厳しいかもしれません。
@kazu 了解です。では、またの機会ですかねー。
もうしわけありません。
来期の予算に期待!:muscle:
@ has joined the channel