cats
/monads
/understandingの問題があります。Monad of Nothingはネコでは機能しません
for (...; nothing <- My[Nothing]()) yield nothing
しかしtest22
に示す障害が私の場合のためにcats.monad
が使用できなくなります:私はtest12
しかし、それはfor
構文を可能に奇妙に見えることを実感
import cats._
import cats.implicits._
final case class My[T]()
implicit val monadMy: Monad[My] = new Monad[My] { ... }
// this compiles
def test11[A, B](m: My[A], f: A => B): My[B] = m.map(f)
// this fails: value map is not a member of My[Nothing]
def test12[B](m: My[Nothing], f: Nothing => B): My[B] = m.map(f)
// this compiles
def test21[A, B](m: My[A], f: A => My[B]): My[B] = m.flatMap(f)
// this fails: type mismatch;
// [error] found : A => My[Nothing]
// [error] required: A => My[B]
def test22[A](m: My[A], f: A => My[Nothing]): My[Nothing] = m.flatMap(f)
: 次のスニペットを考えてみてください。 Nothing
のモナドはモナド法に違反していますか?
flatMap
M[Nothing]
にお伝えください。
ありがとうございます。
UPDATE私はへのアクセス権を持たない、私はMy
共変をした場合には、この最小限のコードスニペットは、コンパイルだろうが、残念ながらもともと私はcats.Free
を使用しています。
UPDATEは、もう一つの回避策は、すなわち、どこでも、私はtest12
が必要ですが、再び、私はM[Nothing]
ための行動が他のタイプよりも異なっている理由を理解したいと思いますtest11
を使用し、どこでも私はNothing
を使うポリモーフィック機能を使用することです。
更新日私がNothing
に変更した場合、 Int
それはコンパイルされます。ですから、これは設計によるものです。しかし、なぜ?
更新もう1つの回避策:scalaz
に切り替えます。
更新日問題はちょうどscala
に関連しています。
UPDATE回避方法:未定義の場合はtype Bottom <: Nothing
を宣言し、代わりに使用してください。
心のスイッチをオンにすると便利ですでした作成する?あなたは何を達成しようとしていますか? –
例えばリストモナドが失敗した場合、全てが空リストになります。これは 'val failure:List [Nothing] = Nil'です。もちろん、私はdef failure [T]:List [T] = Nil'を実行してもうまくいくが、... –
リストモナドの失敗はどういう意味ですか?わかりません。 –