我想创建一些简单的自定义字符串插补器,并且我成功了,只要我不尝试使用类型参数。使用StringContext的通用字符串插补器
import scala.concurrent.Future
object StringImplicits {
implicit class FailureStringContext (val sc : StringContext) extends AnyVal {
// This WORKS, but it's specific to Future :(
def fail[T](args : Any*): Future[T] = {
val orig = sc.s (args : _*)
Future.exception[T](new Exception(orig))
}
// I want this to work for Option,Try,Future!!
def fail[M,T](args:Any*): M[T] = {
val orig = sc.s (args : _*)
// Obviously does not work..
M match {
case Future => Future.exception(new Exception(orig))
case Option => None
case Try => Failure(new Exception(orig))
case _ => ???
}
}
}
}
我可以得到这个工作吗?我不能使用参数多态,因为我不是定义这三种类型的人。
这种伪代码模式匹配的类型级别的等价物是什么?
最新尝试
我最新的尝试是隐式地使用,但我没有这样的隐式!根据类型推断,我实际上有兴趣抓住一个类型,编译器要我返回。
def fail[T, M[T]](args:Any*): M[T] = {
val orig = sc.s(args: _*)
implicitly[M[T]] match {
case _:Future[T] => Future.exception(new Exception(orig))
case _ => ???
}
}
<console>:18: error: could not find implicit value for parameter e: M[T]
implicitly[M[T]] match {
^
<console>:19: error: value exception is not a member of object scala.concurrent.Future
case _: Future[T] => Future.exception(new Exception(orig))
^
参见:'DEF试验[A,B](一个:任何):A [B] = ???'=>编译错误:'A'确实不采取类型参数。 'A'是通用的,例如可以是'Int'。 Int [String]不存在。所以编译器总是会抱怨。 –
所以也许我需要告诉编译器,我想A是一个更高的类型?怎么样? – sscarduzio
'def fail [T,M [T]](...)'让你分道扬part。但我不明白你将如何在呼叫站点指定M。您是否期望编译器根据所需的返回类型推断M使用的内容? –