在无形类型上进行模式匹配可以吗?

时间:2014-09-03 23:06:02

标签: scala shapeless

我可以通过google找到使用Typeable演员的所有示例都包含for表达式。这对我有用,但我想知道这是否合适。我是一个全新的无形的人:这是我在lib中的第一次导入。

import shapeless.Typeable._

val blarg: Future[Any] = (worker ? ListOfLongsPlx(foo)) // I know Any === Try[List[Long]]
blarg.map {
  _.cast[Try[List[Long]]] match {
    case Some(Success(xs)) => xs
    case Some(Failure(f)) => /* reporting the failure or just default: */ ;  List()
    case None => /*reporting bad cast just a default: */ List()
  }
}

我是否应该预料到这种模式会出现问题?

要清楚,这是通过我的测试。

1 个答案:

答案 0 :(得分:5)

您的方法很好(虽然我不明白特定代码如何工作,因为Try不是Future),但您实际上可以获得更好的语法模式与TypeCase匹配:

import shapeless.TypeCase
import scala.util.{ Failure, Success, Try }

val thing: Any = Try(List(1L, 2L))

val TryListLongCase = TypeCase[Try[List[Long]]]

thing match {
  case TryListLongCase(Success(xs)) => xs
  case TryListLongCase(Failure(f)) => println(f); Nil
  case _ => println("Some unexpected thing"); Nil
}

结果将适当地输入为List[Long]