简而言之,我想声明一个这样的特征:
trait Test {
def test(amount: Int): A[Int] // where A must be a Monad
}
这样我就可以在不知道monadA
是什么的情况下使用它,例如:
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
}
正如我所说,我还在学习这个 monad 的东西......如果你发现我的代码不是正确的方法,非常欢迎你指出来~
非常感谢~~