haskell - Conversion between different eDSLs (different type class constraints) -


i'm trying "compile" simple edsl atom language. problem arises here is, type class constraints on types/functions not match of atom language.

one edsl compiles atom copilot, has same problem solves in rather verbose way. follows simplified version of involved datatypes:

{-# language gadts #-}  data type        tfloat :: type float  data op1 b     neg :: type -> op1 a  class nume instance nume float  data exp e     eneg :: nume => exp -> exp 

type , op1 part of new edsl, nume , exp belong compilation target. convert between edsls @ point need function op2exp following type:

op2exp :: op1 b -> exp -> exp b 

now way atom handles rather verbose:

data numeinst e = nume e => numeinst  numeinst :: type -> numeinst numeinst tfloat = numeinst  op2exp :: op1 b -> exp -> exp b op2exp op = case op of     neg t -> case numeinst t of numeinst -> eneg 

this works, quite cumbersome , full of repetition.

question:

is there way, maybing using new language features, write op2exp function in easier way? ideally along lines of:

op2exp (neg t) = eneg 

ideally, wouldn't need type data type , have compiler figure out types match.

you make op1 datatype parametric in target language, using type parameter of kind * -> constraint. looking @ atom , ivory libraries, think should work:

{-# language gadts, constraintkinds #-}  data op1 expr b     neg :: (expr a, num a) => op1 expr a  class atomexpr instance atomexpr float  data atomexp e     eneg :: (atomexpr a, num a) => atomexp -> atomexp  op2exp :: op1 atomexpr b -> atomexp -> atomexp b op2exp neg = eneg 

Comments

Popular posts from this blog

php - Calling a template part from a post -

Firefox SVG shape not printing when it has stroke -

How to mention the localhost in android -