haskell-jp / questions #10

stack clean では不足ってことですよね。。。
clean だと全部消しちゃいませんか?
正確に把握してませんが、 stack clean --help 曰く
local package だけなので自分で作った(cabalファイルに書いた)パッケージだけではないかと認識しています。
あとは extra-dependencies としてビルドしたものぐらい?
おう,そもそも clean はビルド生成物だけを消すコマンドなんですね.ビルド生成物を消したいわけじゃなくて,hoogle dbとか各ltsごとに保持しているパッケージ情報を消したいです
もしかして、 .stack-work 以下に各resolverのコンパイル済みパッケージが入ると勘違いしてませんか...?
実際には ~/.stack/ 以下のはずです。
その辺はcabal sandboxから改善されているはずなので。。。
うーんでも, 200M ぐらいあるので…
そういえば、と思って自分も手元のプロジェクトを見てみたら、334MBもあったw
そして du -hs で掘ってみた感じ、どうも自分のパッケージをビルドしてできる
.stack-work/dist/x86_64-linux 以下が主にとっているみたいですね。。。
あ、と思ったら .stack-work/install 以下も結構とってるな。。。
主に消したいのは .stack-work/install 以下の使わないlts分のものですね
あってもおかしく無いと思ったんですけど,まあ無いなら普通に消します
なるほど。そっちも掘ってみましたが、やっぱり入っているのは自前のパッケージっぽいですね。
だから思い切って消しちゃってもいいかも。
そして stack clean しても消えない模様。。。 :disappointed:
結論、resolver毎にビルド結果を残してしまうstackの仕様に加え、GHCがビルドしたものがそもそも大きすぎるのが問題な気がしました :sweat_smile:
https://twitter.com/hsjoihs/status/951851803531816960
freeモナドとかoperationalとかcontとかを学ぶ際に最初に読むべきもの、なんかオススメありますかね(英語可)(現状の理解度:StateTぐらいなら分かる、圏論の背景知識は不足している、LispとかSchemeとかcall/ccとかは全く理解していない)
freeモナドについては
https://apfelmus.nfshost.com/articles/operational-monad.html などを見ながら,ひとまずこのパッケージで何か作って見るのがいい気がします.
https://hackage.haskell.org/package/MonadPrompt
オススメはIOモナドですかね?(ファイルの読み取りや書き込みなどを自分のDSLで書けるようにする,より良いIOのための小さなフレームワークを作るなど)
継続(continuation/cont monad)については,話題が結構多岐にわたるんですが,基礎的な話についてはあまり良い資料を見つけられませんでした.
https://github.com/lotz84/haskell/blob/master/docs/continuation.md
とかで幾つか資料を見て見るのがいいんですかね?(誰か強い人にお任せ)
僕もWindowsの挙動は詳しくないのですがstack corruptionが起きるそうです。
コメントの通りwindows_cconv.hを使うのがおすすめだそうです。
Qiitaの僕の記事です。
FreeモナドとOperationalモナドについての説明もありますので、もしよろしければ。ご参考までに。
入門向けではないですが私のお薦めは “FUNCTIONAL PEARL Data types a la carte” です。 http://www.cs.ru.nl/~W.Swierstra/Publications/DataTypesALaCarte.pdf
data types a la carteのfree monadに関しての洞察は,代数的な側面が強いので,あまりモナドに設置させるという感じでは無いかもしれないですね.freeモナドの方を重点的に解説してる記事としては
http://www.haskellforall.com/2012/06/you-could-have-invented-free-monads.html
とかもありますね
ただ,data types a la carteの手法自体は,free monadとは独立に知っておくと面白いと思います(理論面でも技術面でもfreeモナドとつながりが深いですし)
枝が Map k で分岐している木
data X k a = Leaf a | Node (Map k (X k a))

に特別な名前が付いていますか。二分木とかトライ木のような。
トライ木と呼んでもいいのかな。(キーが文字列でないだけで)
Map に Node が入り得るんですか?
例示したコードと若干異なりますが、
Rose treeの Map 版、ぐらいですかね。。。
Freeモナドについては、私はfumievalさんやちゅーんさんのブログで勉強しました
Cofree はrose treeを一般化したものなので、 Cofree f afMap k としたバージョンともいえそうです。
https://www.stackage.org/haddock/lts-10.3/free-4.12.4/Control-Comonad-Cofree.html#t:Cofree
あー、rose tree (多分木)ですね。
Free (Map k) のつもりだったのですが、Cofree の方ですか?
ああー、例示したコードだとその方が近そうですね。。。
多分木は Free [] ですよね。多分。
そうか。私が想定していたrose treeの場合、木の各階層に値が入ると思っていたんですが、提案されたものの場合葉にしか値が入らないのか。
枝に値が入るかどうかで名前が変わりそうですね。
Leaf に値が入る木って、Haskell だとあまり見ないですね。。。
トライ木は枝に値が付くのか。
葉に値が付く木で、僕が Haskell で使ったことがあるのは、Huffuman 符号の木ぐらいですねぇ。
入門本ではどういう例で載せているか見たら「H本」はNodeにだけ持ち、「関数プログラミング入門」ではLeafにだけ持ってました。
そもそもは Free ((->) k) の例で名前がついているデータ型にどういうのがあるかなと思っての質問でした。
例えば Bool -> a の Free は(Leaf にだけ値を持つ)2分木、とか。
話のついでで、これも入門向けではなくて圏論的な解説ですが読みやすく F代数の勉強にもなったので。
“Free monads in category theory (part 1)” https://www.paolocapriotti.com/blog/2013/11/20/free-monads-part-1/
part 3 まであります。
もう決着がついてるのかわからないのですが,Free ((->) k)は多分木の一種だと思いますね. k = Bool なら2分木ですし, Ix k => ならFree []と同じです.多分木は通常Cofree ((->) k)だと思いますが,Free ((->) k)はそれの葉にだけ値を持つようなもの Cofree ((->) k) (Maybe a)のインスタンスのような感じだと思いますね
通常アルゴリズム界隈だと,木の種類というよりは実益がある木かどうかでデータ構造を分類する風潮があるので,あまり抽象化したものに名前をつけるという感じでは無いと思います(まあ,あまり詳しく無いのでもしかしたら名前がついてるかもですが)
トライ木なんかも構造に注目した名前じゃなくて主な機能であるRetrievalの「trie」から来た名前ですもんね。
ありがとうござます。
答えているのは、最近networkのメンテナーになった人ですね。
Freeモナドはよく https://hackage.haskell.org/package/free-4.12.4/docs/Control-Monad-Free.html が題材に出されているのですが,個人的には Functorからmonadが抽出可能とか,圏論的な意味でのfree objectの代数的な性質の話というよりも(こちらも分かれば面白いのですが,分かる最短ルートは圏論を勉強することだと思っています),Haskellプログラミングにおいての入門としては https://hackage.haskell.org/package/MonadPrompt-1.0.0.5/docs/Control-Monad-Prompt.html にあるように,
1. Prompt is pure; it is only through the observation function runPromptC that you can cause effects.
2. You don’t have to worry about the monad laws; they are correct by construction and you cannot break them.
3. You can implement several observation functions for the same type.
となるような抽象データであることが,一番重要だと思っています.その点で結構MonadPromptは良いチュートリアルになっていると思いますね.
operationalもfreeも出回ってる実装は結構奇怪で,それの理解を行うためには圏論の知識を多少身につけておいたほうがいいのですが,どちらも一番の強みは中身の実装を気にしなくても(実際多くのパッケージは,中身は公開してないと思いますね)なぜかモナドに設置できることなので,中身のメカニズムを知るのはHaskellプログラミングにおいてそのアドバンテージが分かってからでもいいと思いますね
返信遅くなってしまいすみません:bow:
なるほど!どうもありがとうございます:pray:
あ,それから continuation については,この記事が非常にわかりやすいと思います.3本立てです
https://genkami.github.io/2018/01/14/01-haskell-continuation.html
@ has joined the channel
(Numではなく)任意の型クラスのデフォルトの型を指定する方法ってありましたっけ?
ないはず
default キーワードでできた気がしましたが現状 Prelude の数値クラスに限定されているみたいですね。 https://prime.haskell.org/wiki/Defaulting