ScalazのMonad則

7
[1..100]>>=pen @1to100pen

@xuwei_k Functor則と Monad則から Applicative則ってでるんじゃなかったんでしたっけ。(自分で確認してない)

2013-11-29 13:47:59
Kenji Yoshida @xuwei_k

@1to100pen ん?どういう意味ですか?

2013-11-29 14:02:19
[1..100]>>=pen @1to100pen

@xuwei_k Applicative則ってpure f <*> pure x = pure (f x)みたいなやつのことですよね。モナドだけに関する話だったらFunctor則とMonad則だけでApplicative則はそれらから導かれるんじゃなかったっけという意味でした。

2013-11-29 14:22:10
[1..100]>>=pen @1to100pen

@xuwei_k あ、「13個の実装を実装しなければならない」ではなく「13個の法則を満たさなければならない」でしたか。よく読んでいませんでした。すみません。

2013-11-29 14:23:15
Kenji Yoshida @xuwei_k

@1to100pen Monad則とFunctor則満たせば、自動的にApplicative則も満たすってことですか?

2013-11-29 14:28:51
Kenji Yoshida @xuwei_k

@1to100pen scalaz.Monadのインスタンス定義する場合に、最低限実装しないといけないのはpointとbindですけど、パフォーマンスのために、このapのデフォルト実装 https://t.co/fsj5Sn0M9j をoverrideすることがあるので

2013-11-29 14:49:21
[1..100]>>=pen @1to100pen

@xuwei_k override するのはモナドの bind などだけですよね。Applicativeの(Haskellでいうところの)<*> を override するのでなければ Functor則とMonad則だけを確認すればよいと思っているのですが。

2013-11-29 14:57:46
Kenji Yoshida @xuwei_k

@1to100pen いやそうじゃないです。<*>やmapをoverrideする場合があります

2013-11-29 15:07:57
[1..100]>>=pen @1to100pen

@xuwei_k そういうことでしたか。納得しました。意図を勘違いして失礼しました。

2013-11-29 15:09:46
Kenji Yoshida @xuwei_k

「デフォルト実装をoverrideしない場合はモナド則の3つだけを満たすことを確認すれば他も満たすことは自明」なので理想としては「デフォルト実装をoverrideした場合だけ関連するlawもテストすればテスト時間減る」けど「デフォルト実装をoverrrideしたかどうか?」(続く

2013-11-29 15:14:26
Kenji Yoshida @xuwei_k

は、外からは分からないし、「デフォルト実装をoverrideした場合に関連するlawのテストのみを手動で追加する」のは面倒すぎるので、現状のScalazではテスト時間の短縮は諦めて「デフォルト実装使ってるので必ず成功するとわかりきっていても全部のlawのテストをする」となってる

2013-11-29 15:16:48
[1..100]>>=pen @1to100pen

@xuwei_k 念のためですが、(Haskellでいうところの) pure = return; (<*>) = ap という実装にしているのならば Applicative則を改めて確認する必要はないというのはいいのですよね。

2013-11-29 15:17:52