y.isDefined}が、必ず成功してしまう。ここで絶妙なのが「すべてSome、またはすべてNoneしか発生しない」のではなく「SomeもNoneも発生するけど、発生する場合に必ず両方Someか両方Noneになる」*1というバグり方をしているということです。Scalazはかなり多くの部分でScalacheckを使っているので「このScalacheckのバグ、Scalazに影響あるかな?」と思って試してみたら、案の定影響がありましたhttps://github.com/scalaz/scalaz/issues/579見つかったのは「OptionTのApplyのインスタンス定義と、LazyOptionTのApplyのインスタンス定義が、Monadのbindの定義と整合性がなくておかしい」というバグです。Scalacheckのバグが絶妙なのは「両方Some、もしくは両方Noneの場合は、このScalazのバグも見つからなかった」というところです。{つまり、比較すると以下のようになっていてsemigroupoidsの場合は、MaybeTのApplyのインスタンスを定義するのに、MonadとBindを要求する現状のScalazは、OptionTのApplyのインスタンスを定義するのに、Applyだけを要求する(そして、その結果定義されたものが間違っている?)semigroupoidsのほうが制限が厳しいです。これは、semigroupoidsが正しい、つまり「MonadやBindがないと、MaybeTのApplyのインスタンスは定義できない」のだとしたら、Scalazのほうを結構直さないといけないですね。その場合色々消すだけなので、シンプルにはなりますが。バイナリ互換保ったまま7.0.xも直すのとか地味に面倒・・・*4もしくは「semigroupoidsのMaybeTのApplyのインスタンス定義は間違っていないけど、もっと制限を緩くできるよ」というツッコミなどあれば教えて下さい。予想通り「Monadがないと、OptionTのApplyのインスタンスは定義できない」みたいで、その方向で修正されました。1注目記事はてなブログをはじめよう!xuweiさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。