要するに、次のような特性を宣言したいと思います。
trait Test {
def test(amount: Int): A[Int] // where A must be a Monad
}
モナドが何であるかを知らなくても使用できるようにA
、次のようにします。
class Usecase {
def someFun(t: Test) = for { i <- t.test(3) } yield i+1
}
詳細...
基本的に、私は次のようなことをしたい:
class MonadResultA extends SomeUnknownType {
// the base function
def test(s: String): Option[Int] = Some(3)
}
class MonadResultB(a: MonadResultA) extends SomeUnknownType {
// added a layer of Writer on top of base function
def test(s: String): WriterT[Option, String, Int] = WriterT.put(a.test(s))("the log")
}
class Process {
def work(x: SomeUnknownType) {
for {
i <- x.test("key")
} yield i+1
}
}
関数に変更を加えずに、MonadResultA
または のインスタンスを渡すことができるようにしたかったのです。
欠けている部分は、関数をコンパイルするために以下のようにする必要があると思います。MonadResultB
work
SomeUnknowType
test
work
trait SomeUnknowType {
def test(s: String): T[Int] // where T must be some Monad
}
私が言ったように、私はまだこのモナドのことを学んでいます... 私のコードがそれを行う正しい方法ではないことがわかったら、それを指摘することは大歓迎です~
どうもありがとう~~