scala - Type Constraints with 2 Parameters -


given:

scala> sealed trait parent defined trait parent  scala> case object k extends parent defined object k  scala> case object j extends parent defined object j  scala> sealed trait result  defined trait result  scala> case object kresult extends result defined object kresult  scala> case object jresult extends result defined object jresult 

how can implement following f?

scala> def f[a <: parent, b <: result](x: a): b = ??? f: [a <: parent, b <: result](x: a)b 

let's k must have kresult, , j has jresult.

but, concern there's no enforced constraint on passing f[k, jresult] @ compile-time.

or, perhaps resort to:

def f(x: parent): result = x match {   case k => kresult   case j => jresult 

but, weakness of approach make mistake:

def badf(x: parent): result = x match {   case k => jresult   case j => kresult 

?

you need way link kresult k in type system. can achieve adding type parameter a result (optionally, can have upper-bound of parent, may not necessary).

sealed trait parent  case object k extends parent  case object j extends parent  sealed trait result[a]  case object kresult extends result[k.type]  case object jresult extends result[j.type] 

then, b can bounded result[a], enforce fact if a = k, b <: result[k].

def f[a <: parent, b <: result[a]](x: a): b = ???  scala> f[k.type, result[j.type]](k) <console>:16: error: type arguments [k.type,result[j.type]] not conform method f's type parameter bounds [a <: parent,b <: result[a]]        f[k.type, result[j.type]](k)         ^ 

such method doesn't make lot of sense though, because there no way infer result type, must manually supplied. still, how enforce constraints.


Comments

Popular posts from this blog

sublimetext3 - what keyboard shortcut is to comment/uncomment for this script tag in sublime -

java - No use of nillable="0" in SOAP Webservice -

ubuntu - Laravel 5.2 quickstart guide gives Not Found Error -