These are chat archives for scalajp/functional

21st
Oct 2014
piyo7
@piyo7
Oct 21 2014 02:42
shapelessのNatが気になっていたので、自分でも書いてみました。> 型で計算・・・
コンパイル時に型レベルで整数を四則演算してみた - Qiita http://qiita.com/piyo7/items/1216ad44cae2b2aacece
kenji yoshida
@xuwei-k
Oct 21 2014 03:19
FreeモナドとFreeモノイドは、以前 runarorama さんが書いてましたね http://blog.higher-order.com/blog/2013/08/20/free-monads-and-free-monoids
eugene yokota
@eed3si9n
Oct 21 2014 11:15
モナドとモノイドの比較は圏論とかの観点からやってる人がいると思いますが、僕がモノイドを持ち出してきたのは「Foo is a monoid」って言うのは正確じゃないし、どの文脈で二項演算されてるかを知らないと Foo を分かったことにならないから危ういっていうのが、最近モノイドでは理解されつつあると思うから、モナドの合成 「Option is a monad」でもそれは同じでは? という点からでした。
honyacho
@honyacho
Oct 21 2014 14:01
ListもOptionも一般にMonadPlusのインスタンスなのでMonoidとMonadを混同しやすい感がありますね。これがIOだと一般にはMonadまでなのでより数学的なMonadとに移行しやすい感があります
kenji yoshida
@xuwei-k
Oct 21 2014 14:33

「Foo is a monoid」って言うのは正確じゃないし、どの文脈で二項演算されてるかを知らないと Foo を分かったことにならないから危ういっていうのが、最近モノイドでは理解されつつあると思うから、モナドの合成 「Option is a monad」でもそれは同じでは

あーそれを言うのだったら、今回の例が ListOption も両方とも、 M[M[Int]] という例で、押しつぶし方法が Int に依存してて、前提として Monad の押しつぶしの操作は M[M[A]]A の型に依存してはダメなはずだから、そういった前提の説明とか、 更に A が任意の型のときに M[M[A]]M[A] に押しつぶす操作を違う方法で2通り以上例に出して、それらの押しつぶし方法がモナド則満たすのか満たさないのか?という例になっていたら、より良かった気もする

Kota Mizushima
@kmizu
Oct 21 2014 14:44
このチャンネルがあるのを今知った
eugene yokota
@eed3si9n
Oct 21 2014 15:37
List(List.apply(1), List(2, 3), List.apply(4)).foldLeft(List(): List[Int]) { _ ++ _ }
がをちゃんと parametric にした join[A] を実装すべきってことですか? A: Monoid が多分いりますね、sum の例は。だけど、あれは多分モナド則満たすんじゃなかなと思ったので書きました。中間値だったら無理だけど、合計だったら合成するかなと。
kenji yoshida
@xuwei-k
Oct 21 2014 15:39
あーなるほど、満たすのかな・・・? 気が向いたらscalazのlawでチェックしてみようかな
eugene yokota
@eed3si9n
Oct 21 2014 15:44
とりあえず applicative とかを意識しすぎて(?) programmable semicolon とかいう説明をしてるのが、特に Scala の世界では説明になってないのでは? と思ったので書きました
kenji yoshida
@xuwei-k
Oct 21 2014 16:03
ん、でもやっぱり普通のMonadなら A: Monoid の制約さえ存在したらダメだから、そういう意味では(モナド則的なものを考えることが可能かどうか、は別の話として)、やはり普通のMonadじゃないか
Shingo Omura
@everpeace
Oct 21 2014 17:42

どの文脈で二項演算されてるかを知らないと Foo を分かったことにならないから危ういっていうのが、最近モノイドでは理解されつつあると思うから、モナドの合成 「Option is a monad」でもそれは同じでは? という点からでした。

なるほど。入れ子になった型を押しつぶす(join, flatten)がモナドのキモだという所が主眼だったわけですね。それをすごく明確に実感できるのがFreeモナドという流れという感じですね。ありがとうございました。

sumがモナドになれるかという件ですが、モノイドを伴う型ばかりの圏上ではモナドになれると思います。つまりList[X:Monoid]じゃないとダメじゃないかと思います。List上のsumはfreeモノイドそのもので、モノイドはそもそもassociativeなので、そのままモナド則のassociativityも満たせるのではと思います。