【发布时间】:2012-08-09 12:34:09
【问题描述】:
简而言之,我想声明一个这样的特征:
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
}
正如我所说,我还在学习这个 monad 的东西...如果你发现我的代码不是 正确的方法,那么非常欢迎你指出它出来~
非常感谢~~
【问题讨论】:
标签: scala monads scalaz monad-transformers