我的問題,在其最簡單的形式:奇怪flatMap返回類型
object test {
import scala.language.higherKinds
sealed trait IO[+F[+_], +A] {
def flatMap[G[+_] >: F[_], B](f: A => IO[G, B]): IO[G, B]
}
trait FileOp[+A]
val a: IO[FileOp, Int] = null
val b: IO[FileOp, String] = null
val c: IO[FileOp, String] = a flatMap (i => b)
}
這會給我:G
type mismatch
found : test.IO[[+_]test.FileOp[_],String]
required: test.IO[test.FileOp,String]
val c: IO[FileOp, String] = a flatMap (i => b)
^
我期待(在flatMap調用)兩個F
和等於FileOp
和B
等於String
,這是一種權利,除了[+_]
前後[_]
...
任何人都可以解釋爲什麼返回類型不是我所期望的,我該如何解決它?
p.s.這更接近我想要的東西與trait IO
表示:
trait ResourceOp[+A]
trait FileOp[+A] extends ResourceOp[A]
trait DBOp[+A] extends ResourceOp[A]
def readFromFile(path: String): IO[FileOp, String] = null
def writeToDB(s: String): IO[DBOp, Int] = null
val combinedOp: IO[ResourceOp, String] = readFromFile("/txt") flatMap writeToDB
感謝在'摹指出的問題[A]>:F [B]',真正幫助和前〜 我從來沒有想到這一點,但我不熟悉如何隱含<:<'工作... 是否與'def flatMap [G [+ T]>:F [T],B](f:A => IO [G,B]) :IO [G,B]'? – Chris