scala - heterogenous mapping, dependent types at compile time -
trying use this trick, miles sabin, create function accepts parameter of set of predefined types
.
val bool = boolean val timestamp = new timestamp(date.gettime()) val str = "my string"
and following should pass @ compile time
takevalue(bool) takevalue(timestamp) takevalue(str)
but
where takevalue
should fail takevalue(someintvalue)
if implicit
type
int
isn't defined.and failure @ compile time.
trait myconv[k] { type v; def convert: anyref => v } def imakeconv[v0](con: anyref => v0) = new myconv[con.type] { override type v = v0 val convert = con } def takevalue(value:anyref)(implicit conv :myconv[value.type]) : \/[throwable,conv.v] = \/.fromtrycatch(conv.convert(value))
and
implicit val strany = imakeconv((x:any) => x.tostring)
then want takevalue(str)
work @ compile time takevalue(someintvalue)
fail @ compile time since there isn't appropriate implicit
defined it. want limit(at compile time) type of types
takevalue
can take , fail others.
certainly doing wrong here because when calling
takevalue("string")
it throws following @ compile time
not find implicit value parameter conv: myconv[string("string")] - not enough arguments method takevalue: (implicit conv: myconv[string("string")])scalaz.\/[throwable,conv.v]. unspecified value parameter conv.
the meaning of .type
misunderstood. type value.type
type single value - value
. if value
known string
, value.type
not string
, 1 string
- value
.
as result, code tries find myconv[value.type]
, of none exist, if there myconv[string]
available.
have takevalue
use type parameter instead:
def takevalue[t](value: t)(implicit conv: myconv[t]) : \/[throwable, conv.v] = \/.fromtrycatch(conv.convert(value))
or alternatively make type parameter of myconv
contravariant:
trait myconv[-k] { type v; def convert: anyref => v }
which allow myconv[t]
used if value.type
subtype of t
.
you need different myconv
, imakeconv
:
trait myconv[k] { type v; def convert: k => v } def imakeconv[k, v0](con: k => v0) = new myconv[k] { override type v = v0 val convert = con }
Comments
Post a Comment