haskell-ja > Archives > 2015/10/19

2015/10/19 04:29:34 UTC[1..100]>>=pen
#
10月27日(火)「平日夜にすごいH本をちょびちょび読む会 21回目」(定員4名) #Hちょびよみ http://hchobi.connpass.com/event/21685/ いのちをだいじにしながら 人が死なない
2015/10/19 04:54:24 UTCikegami__
#
QuickCheckのGenがモナドでないことはGenの(>>=)がSystem.Randomのsplitを定義に用いていることから推測できます。GenがApplicativeにならないことはGenがモナドではないし、実際apが(>>=)を使うので推測できます。(モナド則やApplicative則を確かめるまでもなく)https://hackage.haskell.org/package/QuickCheck-2.8.1/docs/src/Test-QuickCheck-Gen.html#Gen
2015/10/19 04:59:34 UTCikegami__
#
一方で、Gen aなresizeやsizedなどをbindやreturnでつなげたい気持ちがあって、用いる乱数を決め打ったら問題なくつながるので、厳密にモナド則を満たすべき派は無視して、使っちゃえばよいという気持ちがあると思います。do記法やApplicativeスタイルを使えば見た目に嬉しいという
2015/10/19 05:06:12 UTCikegami__
#
必ずしも推奨されないでしょうが、System.Randomに限らず、「外」からやってくる値が変わりうるために厳密にはモナドにはならないけど、bindとreturnでdo記法が使えて、モナドならApplicativeであるためにデフォルト定義もできて、つまりHaskellでは嬉しい、みたいな話はありそうです
2015/10/19 05:12:06 UTCikegami__
#
Haskell以外の言語ではどうでしょう…モナドにならないものをモナドにすると、モナドから導出されるApplicativeのデフォルトはApplicative則を満たさなくなってしまうし、そもそもモナドからApplicativeを導出するには言語に型クラス的なものが必要でしょうし、do記法のような目に優しい構文糖がないなら、利点よりも欠点のほうが上回るかもしれません(ライブラリ設計者の判断によるでしょう)
2015/10/19 05:27:35 UTCikegami__
#
『関数プログラミング』の9章のDiagがモナド則を満たさないけど見た目モナドにするのもdo記法を使いたいからだと思いますね。ただし、モナド則を満たさないので、普段のモナドプログラムと違い、ネストしたdo(9章のp.198)についてプログラマが十分に気をつけなければならないという点で多少の気持ち悪さを覚えます。にもかかわらずdo記法は見た目優しいから…モナドなら二つのネストしたdoの意味が等式変形によって変わらないですが、モナドでないものを(疑似)bindでつないだ場合も型は合ってしまう(よね?)ので賢人でないのに使えるのかみたいな気持ちがあります。
#
typoしましたが、『関数プログラミングの楽しみ』です
2015/10/19 06:00:50 UTCikegami__
#
QuickCheckのGenについて、上に書いた「用いる乱数を決め打ったら問題なくつながる」というのはまずい表現で、QuickCheckが欲しいものはランダムなものなので、左回りで出てくるものと、右回りで出てくるものが違っても(モナド則をみたさないので)、ユーザとしては構いませんよ、ということでした(謹んで修正します)
2015/10/19 09:39:28 UTC[1..100]>>=pen
#
『関数プログラミングの楽しみ』のモナド則満たさないのは Matrix じゃなかったでしたっけ。Diagも? Matrix の方はやろうと思えば結合則満たすように(P.201脚注に書いてあるようにバッグ使えば)定義できるけど本質に影響ないからやんないよ、ということだと理解しています。
2015/10/19 21:56:05 UTCikegami__
#
『関数プログラミングの楽しみ』p.198に「Diagの(>==)はモナド則(のうち結合法則 ((m >>= f) >>= g と (\x -> f x >>= g))を満たさない」と書いてありました。検証はしていません。
#
p.201 のMatrixも脚注6に結合法則を満たしてないと書いてありますね。こちらも僕は検証していませんけど。