scala - How to pattern match with dependent type without using it? -
this hard phrase, please, let me show example:
trait cache trait querylike { type result } trait query[a] extends querylike { type result = def exec: result } trait cachedquery[a] extends querylike { type result = def execwithcache(cache: cache): result } def exec(query: querylike)(implicit cache: cache): query.result = query match { case q: query[query.result] => q.exec case cq: cachedquery[query.result] => cq.execwithcache(cache) }
this compiles , runs fine pattern matching done on different types (query
, cachedquery
) instead of relying on generics this question.
but still compiler warning :
warning:(18, 12) abstract type result in type pattern a$a4.this.query[query.result] unchecked since eliminated erasure case q: query[query.result] => q.exec
since don't work on dependent type query.result
directly in anyway (like casting different operations), it'd ideal erase , away warning. unfortunately, using wildcard doesn't work reason:
... case q: query[_] => q.exec // type mismatch case cq: cachedquery[_] => cq.execwithcache(cache) ...
is there better way without generating compiler warning?
this error isn't specific path-dependent types. if tried match on query[a]
same error, because type parameter a
erased @ runtime. in case, it's not possible type parameter can other type you're looking for. since query[a]
querylike { type result = a}
, should query[query.result]
, though unusual way @ it. could use @unchecked
annotation suppress warning, if wish:
def exec(query: querylike)(implicit cache: cache): query.result = query match { case q: query[query.result @unchecked] => q.exec case cq: cachedquery[query.result @unchecked] => cq.execwithcache(cache) }
while it's tough if apply actual use-case, restructure code avoid matching entirely, , handle (possibly) more elegantly via polymorphism. since last exec
requires implicit cache
anyway, wouldn't seem hurt allow each querylike
. api can more uniform way, , wouldn't need figure out method call.
trait cache trait querylike { type result def exec(implicit cache: cache): result } trait query[a] extends querylike { type result = } trait cachedquery[a] extends querylike { type result = } def exec(query: querylike)(implicit cache: cache): query.result = query.exec
if query[a]
requires exec
without cache
, provide overload dummyimplicit
allow work without one.
def exec(implicit d: dummyimplicit): result
Comments
Post a Comment