haskell-jp / random #89

@quarter has joined the channel
もしかしてこれは自分が作りたいなぁと思っていたものではないか :open_mouth:
anythingToString :: forall a. a -> String

https://hackage.haskell.org/package/recover-rtti-0.3.0.0/docs/Debug-RecoverRTTI.html
convertible パッケージの Data.Convertible.Convertible クラス、別パッケージに分離してほしいな
data-default-class パッケージのように
convertible の依存する old-time が build-type: configure で Windows において手間がかかるので
... Replies ...
Kengo Tachibana
@Kengo Tachibana has joined the channel
https://github.com/haskell-jp/blog/issues/206 一人では経験が足りなくて作れない記事を、せっかくなので haskell-jp のブログに投げました。
まだちゃんと読んでないのですが今週のHaskell Weekly, ReaderT より ImplicitParams 使えよって記事と ImplicitParams 使うと危ないって記事が両方載ってるっぽくて興味深いですね :smirk:
https://haskellweekly.news/issue/256.html
読めました。こちらがその「 ImplicitParams 使うと危ないぞ」という記事 https://chrisdone.com/posts/whats-wrong-with-implicitparams/
どうも問題は、単に
?param

と書いたときに ReaderT でいうところの param <- ask をさしているのかそれともよそで ask した結果の param を参照しているのか、型推論した結果からしか分からないところにあるみたいですね。
@金具 has joined the channel
@さんたむ has joined the channel
GHC 9.2のブランチが切られました。 alpha版のリリースも近いとのことです。
GHC 9.2 has branched
https://mail.haskell.org/pipermail/ghc-devs/2021-March/019756.html
なお、9.0.2 と 8.10.5 のマイナーリリース版もそれぞれ別途準備中です。
@algas has joined the channel
(間違えて general に投稿してしまったのでこちらの投稿し直します。すみませんでした :man-bowing: )
GADTsの構文ってまだ「subject to change」って扱いだったんですね。知らなかった!
https://github.com/ghc-proposals/ghc-proposals/pull/402
かなり、いい感じだね。
GHC2021とレコード周りの修正がめっちゃありがたいですねー。プロファイリングやデバッグ周りもよさげな新機能が :eyes:
... Replies ...
ペッパー君
@ペッパー君 has joined the channel
listDirectory 関数が返すリストの順番に依存したコードを書くと、ある日突然何の脈絡もなく順番が変わってしまってバグり出す、という恐怖体験が続きました... :fearful:
https://haskell-jp.slack.com/archives/CBY49962V/p1617544631003000
なんか過ごそう(まだ読んでないですすみません:bow:)
https://z.haskell.world/
@Tomo has joined the channel
Pythonを操作インターフェイスにしている、おそらくJavaで書かれたライブラリをHaskellで操作しようと思っています。
protocol bufferファイルを公開しているので、それを使えばHaskellに型をマッピング出来て、しかも通信部分も型安全に出来るのではと思いました。
とりあえず検索してみた所、 https://hackage.haskell.org/package/protocol-buffershttps://github.com/google/proto-lens がよく使われてそうだと分かりました。
Protocol Bufferを扱うのは実は初めてなので、どのように使うのが王道なのかよく分かっていません。
「こっちのライブラリの方が良いよ」とか「このライブラリが便利だよ」などの助言があれば教えていただけると嬉しいです。
... Replies ...
cabal-install のあるバージョンから Windows で実行ファイルをインストールしたときのフォルダー変わったのかな
旧:$Env:AppData\Roaming\local\bin
新:$Env:AppData\Roaming\cabal\bin
@basashi has joined the channel
@Benjamin Bray has joined the channel
@Yasutaka Odo has joined the channel
こちらの質問 https://teratail.com/questions/332942?rss に回答してたら let ... in って面倒くさいなぁという気持ちになり、これまでの鬱憤もあってこんな乱暴なことをいってしまった :cold_sweat: んですが、 https://twitter.com/igrep/status/1381803450321661953
皆さんどんな場面で let ... in を使いますか?
Hiromi ISHII / mr_konn
個人的には関数は where で、簡単な定数は let で定義しますね
Hiromi ISHII / mr_konn
let は上から下に読めば定義がわかるので、本体が大きくなりすぎない場合は let に纏める傾向がありますね。あと、where だと節ごとに共通する変数しか使えないので、局所的な条件に依存するような定義は let を使うことがおおいですね
case の中の個別の変数は let in を使うかな。
それもこれも dolet で実は実現できるけど、やっぱり違和感ありますかね... :disappointed:
Hiromi ISHII / mr_konn
do を Monad や Applicative 以外の用途に使うのは可読性を損うのであんまり好きじゃないですね
第一引数に部分適用しておくと早くなる関数があった場合、where とか使うと、どこまでちゃんと評価されるか分からない場合があって、その場合は let in で書きます。
aes128gcmEncrypt :: Key -> (Nonce -> PlainText -> AddDat -> [CipherText])
aes128gcmEncrypt (Key key) =
    let aes = throwCryptoError (cipherInit key) :: AES128
    in \(Nonce nonce) plaintext (AddDat ad) ->
      let aead = throwCryptoError $ aeadInit AEAD_GCM aes nonce
          (AuthTag tag0, ciphertext) = aeadSimpleEncrypt aead ad plaintext 16
          tag = Byte.convert tag0
      in [ciphertext,tag]

以前、この関数を where で書いてたんだけど、プロファイルを取ったら意図通りに動いていなくて、let in で書き直しました。
Hiromi ISHII / mr_konn
あと、厳密な話をするのならば、doの中の let statement は構文糖衣であって、最終的には let expression に脱糖されるので「do の letでいいじゃん」はいささか循環論法ではないかなと思います(cf. https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-470003.14
ところでkazuさんの :point_up: のサンプルを見ていて気づいたんですけど、わたしこれまで、 letin の行頭をそろえちゃいけないと思っていたんですが(本件の元となった質問 https://teratail.com/questions/332942?rss でも質問者が間違えてそろえてしまってハマっています)、そろえていい場合もあるんですね... :cold_sweat: (むしろそろえるのが普通なのか)
do の中で let .. in を使うのが鬼門なのか...
Hiromi ISHII / mr_konn
仕様上 case alternative にも where は書けるんですが、あんまり知られておらず読みづらいので、僕も case の中の個別定義は let を使いますね
case の中の where は、どうやって書くのか、未だに分からないです。。。
Hiromi ISHII / mr_konn
オフサイドルールが直観に反する局面なのでぼくもわからないですね……
Hiromi ISHII / mr_konn
あと do 式の中という話に限定するのなら基本的に let ... in は使わないで let statement だけ使います。一般的な文脈で do let を使うべきという話ではなく、do 式の中では let 文を使うべきという話ならその通りだと思います
pure な関数だと let と in は連続行だとみなされれば、どのように書いてもいいのでは?
Hiromi ISHII / mr_konn
fourmolu とかだと

let foo = bar
 in ...

みたいに式/定義のはじまる位置が揃うようにフォーマットされますしね。do のようにオフサイドルールが重要になってくる場面以外はどう書いてもよい(何なら

let foo = bar in
foo + 1

みたいに書いてもいいですし)
try が非同期例外を捕捉しなくて悩んでいたんだけど、非同期例外が連続して2回飛んでた。。。
QUICサーバのソケットがリークするので、IO manager のバグを疑っていたんだけど、ソケットはちゃんと閉じられており、直後に同じアドレス/ポートのソケットができていた。。。
最近、こんなのばっかり。
WAI製のウェブアプリをAWS Lambdaで動かせるアダプターですって。面白い。
https://github.com/bellroy/wai-handler-hal
Shinichi Takano
@Shinichi Takano has joined the channel
!here 牛歩の進みだった Haskell Day 企画ですが、そろそろスケールさせようかという段階になってきたので、志願スタッフを募集して音声会議しようと思います
「やりたい!」「とりあえず話だけでも……」という方は :raising_hand: お願いします
Call for Japanese volunteer stuffs of Haskell Day.
https://github.com/haskell-jp/community/issues/30
テストがセグフォするので、gdbで追ってるんだけど

evacuate1 (p=p@entry=0x42005d49a8) at rts/sm/Evac.c:839
839	rts/sm/Evac.c: No such file or directory.

と言われて、GCのバグみたいで、頭を抱えています。