ScalazのMonad則

7
yadokarielectric @yadokarielectri

モナド則を満たしてるかどうかを調べる仕組みがscalazにあるけどhaskellにそういう仕組みあるのかなって話をしてる

2013-11-28 20:24:56
Go! Go! jhc-tan! @masterq_teokure

@yadokarielectri モナド則を満すかって保障できるもんなんでしょうか。。。

2013-11-28 20:27:42
Go! Go! jhc-tan! @masterq_teokure

ヘタすると全数テストになる気が。

2013-11-28 20:27:52
yadokarielectric @yadokarielectri

@masterq_teokure 満たすようにインスタンスを定義しないとモナドにならない気が

2013-11-28 20:30:57
Go! Go! jhc-tan! @masterq_teokure

@yadokarielectri うーん、やぶることはいつでも可能では。。。

2013-11-28 20:31:15
Go! Go! jhc-tan! @masterq_teokure

@yadokarielectri モナドにはならないですよ。でもテストするしくみがあるというのは「いつでもモナド則をみたすかテストできる」とは信じがたいなと。

2013-11-28 20:31:52
yadokarielectric @yadokarielectri

@masterq_teokure なんかscalazではできるみたいな話をしてました。聞き間違えてるのかな

2013-11-28 20:36:17
Go! Go! jhc-tan! @masterq_teokure

@yadokarielectri どうやってscalazでモナド則のテストをしているのか気になります。。。あ、やっぱ気にならないかも。。。

2013-11-28 20:36:54
似非原 @esehara

ちょっとScalaの怖い人に、オブジェクト指向的に継承して13個の実装を実装しなければならないのは、モナド則を満たせばモナドでOKというHaskellの話とどうちがうのか、ご教授が欲しい。さっきの発表で気になったのはそのあたり #fud_scala

2013-11-28 20:39:11
Kenji Yoshida @xuwei_k

@masterq_teokure @yadokarielectri Scalacheck(HaskellのQuickcheck相当)で雑に引数生成してやってるだけです。証明とは程遠いので完全ではないですが、やらないよりはましというか。実際にそれのお陰で何回かバグ見つかってるので

2013-11-28 20:42:07
Go! Go! jhc-tan! @masterq_teokure

@xuwei_k @yadokarielectri なるほど。quickcheck使うなら理解できる気がします。

2013-11-28 20:43:02
Go! Go! jhc-tan! @masterq_teokure

@xuwei_k @yadokarielectri うーん。IOモナドっぽいないにかをrunMyIOみたいので結合する場合はどーするんでしょうね。。。

2013-11-28 20:43:56
Go! Go! jhc-tan! @masterq_teokure

それはモナド則と関係ないか。。。

2013-11-28 20:44:24
Go! Go! jhc-tan! @masterq_teokure

@xuwei_k @yadokarielectri Scalaでは全ての型は中身を検査できるんですか???

2013-11-28 20:44:54
Kenji Yoshida @xuwei_k

@masterq_teokure いや、その辺はもう色々と無理があるので本当に雑というか諦めていますね

2013-11-28 20:46:37
Go! Go! jhc-tan! @masterq_teokure

@xuwei_k なるです。それでもテストしただけの価値はあったということですね。。。

2013-11-28 20:47:02
Kenji Yoshida @xuwei_k

.@esehara 「13個の実装を実装しなければならない」ではなく「13個の法則を満たさなければならない」で、しかも「明示的にデフォルト実装をoverrideしない限り(主にパフォーマンスのためにoverrideすることがある)、13個のうちのほとんどは満たす」ですね

2013-11-28 20:49:13
似非原 @esehara

@xuwei_k お返事ありがとうございます。「その辺の13個の法則を満たさなければならない」という部分がしっくりこないんですね。haskell上のモナド則自体は3つのはずなのに、急に付随する10個が出てくるかつ「ほとんど(3つではなく?)」というのがもやっとしています。

2013-11-28 20:55:51
Kenji Yoshida @xuwei_k

.@esehara Haskellでも(よっぽど使い捨てのコードでない限り)Monadのインスタンスを実装したら、そのMonadと整合性があるFunctorとApplicativeのインスタンスを実装すると思うので「それらすべてが満たすべき法則」は3つではなく増える、と思います

2013-11-28 20:58:21
Kenji Yoshida @xuwei_k

@esehara 言い換えると、その13個のうちのいくつかは「Functor則」や「Applicative則」と呼ばれてるものそのものです。あとは「FunctorとMonadのメソッドに整合性がある」とかそういうものです

2013-11-28 21:01:12
似非原 @esehara

@xuwei_k ご丁寧な解説感謝致します。Scalazだと、「Monad則」だけでなく、「Functor則」「Applicative則」というMonadを使うために、「Monad」という型クラスで満たさなければならない(既に満たされている)法則が含まれていると、理解しました。

2013-11-28 21:12:07
似非原 @esehara

GHC/Base.lhsとScalazのMonadのコードを読み比べないとわからないなー、そこはちゃんと嫌がらずに比較して考えよう。

2013-11-28 21:13:12
似非原 @esehara

ちょっと自分の中で反省会。確かにHaskellのモナド則を利用してモナドを説明するのは、必要最小限でいいんだけど、そのモナド則の表現自体がHaskellの言語仕様と密接だから、その辺を噛み砕かないと、余計な混乱を招く感じはある(自分もよくやる)。

2013-11-29 00:58:33
似非原 @esehara

怖いScalaで、Scalazのモナドの話を聞いて、俄然興味が出てソースコードを読んだけど、クソ面白い。特にオブジェクト指向と関数型の違いについて、HaskellのBasic Library ( http://t.co/eKEH0SZSZ1 ) と合わせると凄いヒントになる。

2013-11-29 13:08:16