haskell-jp / questions #9

「ラムダ抽象の高階単一化の決定不能性」について調べてみます。なにかお勧めの文献ありますか?
ああ、Agdaの実装になんかあった気がする。
@bonotake commented on @bonotake’s file nix で slack をインストールしようとしてコケました: stackでした :sweat_smile:
うへぇ。私6年間まったく進歩してない(どころか退化している)ことが晒されたぁ。orz
勉強しなおしだ。
なんか壊れたバージョンを間違ってビルドしてしまったんですかね。。。
それにしても不思議ですね。。。そもそもなんでわざわざソースからインストールしてるんだろう。。。
:thinking_face:
@msakai すいません,ラムダの等価性判定でeta expansionがうまくできない場合があるって話を聞いたことがあって勘違いしてましたが,injectivityの問題なんですね.これってつまり,Injectivityがうまく追跡できれば,f a f b => a bの展開が(安全に)できるってことなんですよね.
injectivityが辿れれば,ラムダのunifyはうまくいくということなんですかね?
Oh…12/2のしか見てませんでした.すいません忘れてください
:point_up: のissue、もうcloseされましたね。言及している方のissueももう解決したみたいですし、今ならいいのかも。
@hs.ioling.hs has joined the channel
@igrep pinned a message to this channel.
code-review で少し触れたのですが、
テストフレームワークはみなさん何がおすすめですかね?個人的にはHSpecをずっと使っていて、この間HUnitを使わざるを得ない状況になったので使ってみたら、HSpecに慣れすぎていたせいか、ものすごく書きにくかったように覚えていまして。。。
過去のコードを読んでいたら \u -> return(u,u) というのを見つけたんですが、こういうのってArrowで書くべきなんですかね
そのあたりは劇的にコードを短くしたりわかりやすくしたりするものでもないので、覚えていたら、程度でいいと思いますよ。
いつもtasty-hspecとdoctestを使ってます!
@fujiyan18 has joined the channel
これって現状, RecordWildCards に対応してないって認識でいいんですかね?なんか対応してない理由とかあるんすかね?(field punsは対応してそうなんですよね)
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#record-pattern-synonyms
いちよ,使えるんですかね? name-shadowing 警告が出るけど…
ExcelのRATE関数相当品が、どこかに転がっていないですかね・・・
http://www.excel-list.com/rate.html
@yoshida has joined the channel
「チャンス」なんてリアクションがあるんですね。結局自前で実装しました。
と言ってもJavaでの実装を見つけたので、それをHaskellに移植しただけですが。
Excel/Java/Haskellそれぞれで微妙に結果が異なるのですが、原因が分からず・・・まあ誤差と言ってもいい程度の差異ではあるのですが。
このために作りましたw :commit: :chance:
https://emoji.pine.moe/#!/ を使っています。
JavaScript で Prettier というフォーマッターを最近使っているのですが、これ保存時に自動的かつ強制的にコードのフォーマットを統一してくるんですね。細かいこだわりとかが無視されてしまうものの、フォーマットを気にしなくて良くなるというユーザ体験はかなり良かったので Haskell 開発でも同じようなことをやってみたいと思っています。

おそらくエディタの保存フックで hfmt や brittany などを走らせればいいと思うのですが、そのようなことをやっている人はいますか? 設定を伺いたいです(できれば Spacemacs か Emacs)。
Elm はフォーマットがかっちり決まってるのもあって 、VS Code 使ってましたが、保存時フォーマットの設定ありましたね(自分は JetBrains 製品に慣れてて VS Code でも自動保存してるせいで、手動フォーマット適用にしてましたが)
フォーマットを気にしなくていいというのが楽というのは同意です
HIE にいちおう brittany を呼び出す仕組みがあるっぽいけど
https://github.com/haskell/haskell-ide-engine/blob/master/README.md#features
haskell-ide-engineは未調査でした。近々 Emacs で使いやすくなりそう! https://github.com/haskell/haskell-ide-engine/issues/338
hfmtを試してみましたが、#ifdef とか .hsc には対応してないんですね。残念すぎる。
私はCloudFunctionsを用いたイベント駆動型のサーバーレス設計が好きです。Haskellにそのようなサービスはありますか?
求めているものかどうか確信が持てませんが、ちょうど今日こんなパッケージを見つけました https://github.com/seek-oss/serverless-haskell
Lambdaの方はこういったことができるんですね、ありがとうございます。
私も山下さんと会うたびにこの話をしている気がするのですが、KindSignature を明示させるようにすれば、決定不能を避けることができたりはしないのでしょうか。
それでうまくいくのなら、GHC に拡張を提案するのが良いのではないかと思っています。
@na4zagin3 has joined the channel
これはよさそうですね。早速試してみたいと思います。
mtlパッケージのReaderTに、 k という見慣れない型パラメーターがあるのを見つけたんですが、これは一体何のためのパラメーターで、使用する際型宣言ではどう書けばいいのでしょうか?
https://hackage.haskell.org/package/mtl-2.2.1/docs/Control-Monad-Reader.html#t:ReaderT
まぁ、 kindの宣言を見る限り継続っぽい何かであることは察せられるんですが。。。
Haddock のバージョンが上がったのか詳細は知らないんですが newtype でのカインドが明示されるようになったみたいですね
ソース読んでみたらControl.Monad.Trans.Readerからreexportしていて、reexport元のControl.Monad.Trans.Readerではそうなってなかったので、何か使っている拡張が関係している気がしてきました。
https://hackage.haskell.org/package/transformers-0.5.5.0/docs/Control-Monad-Trans-Reader.html
ReaderTの定義が

newtype ReaderT r m a = ReaderT (r -> m a)


なので、実は m a* でさえあれば m :: * -> *a :: * 以外でも値を作れますよ、っていう話ですね。
なので  m :: k -> *a :: k に一般化されていると。

https://haskell.jp/blog/posts/2017/10-about-kind-system-part1.html の「種多相」節に書いてある。
とはいえ、MonadをはじめとするReaderTのインスタンスはk=*の場合しか定義されないので、一般化されたReaderTを何に使うのかは良く分からないです
transformersのChangelogによると、0.5からPolyKinded対応したとの事なので、ここで各クラスがまとめて種多相になったっぽい?
続けて済みません、 :point_up: の質問に関連してtransformersのドキュメントを読んでいたんですが、
SelectT と AccumT というこれまた見慣れないMonad Transformersができているのに気づきました。
https://hackage.haskell.org/package/transformers-0.5.5.0/docs/Control-Monad-Trans-Select.html
https://hackage.haskell.org/package/transformers-0.5.5.0/docs/Control-Monad-Trans-Accum.html
それぞれ何のためのものかご存じでしょうか?
特にぱっとソースを読んでみた感じ、AccumTはLazy WriterTと何が違うねん、という感じでした。。。 :cold_sweat:
あ、ごめんなさい AccumT については自己解決しました。

This monad transformer is similar to both state and writer monad transformers. Thus it can be seen as

a restricted append-only version of a state monad transformer or
a writer monad transformer with the extra ability to read all previous output.

と書いてあるとおりですね!
まぁ、 SelectT については張ってある論文読めって感じですかね。。。
set up a reminder “https://haskell-jp.slack.com/archives/C5666B6BB/p1513788569000134” in this channel at 10AM every Friday, Japan Standard Time.
有用そうな質問は積極的に :memo: していきたいですが、ついつい忘れてしまうので取り急ぎ https://haskell-jp.slack.com/archives/C5666B6BB/p1513788569000134 のメッセージを定期リマインダーに追加しました。
とりあえず毎週金曜日で。
Win32 な環境で、FFI に stdcall ではなく ccall と書くと何が起きますか?
ときどき ccall を使っているコードを見かけるのですが、大丈夫なのでしょうか?
ちなみに、Win64だとccallと書くと適切なABIを使うようです。
stdcallと書いても適切なABIを使いますが、無意味に警告が出ます。
stack.yaml で指定してるsolver以外のdb情報などを .stack-work から消してくれる stack のサブコマンドってあったりしますかね?