haskell - Defining Phantom Types - can't compile examples -
i'm trying learn more phantom types. i'm trying read through fun phantom types ralf hinze. he's using keyword with
haven't seen before , can't compile. parse error on =
when try this.
data type t = rint t = int | rchar t = char | rlist (type a) t = [a ] | rpair (type a) (type b) t = (a, b)
earlier in paper, says "with" statements aren't strictly necessary, can set a = t
instead, can't figure out how define data type without them. following errors with: not in scope: type variable 'a'
data type t = rint | rchar | rlist (type a) | rpair (type a) (type b)
what missing?
my guess definition sans-with
suggested in paper is
data type t = rint | rchar | rlist (type t) | rpair (type t) (type t)
above, parameter t
never used. is, indeed, phantom.
this implies that, e.g.
rint :: type
for any type a
. contrast, if with
constraints followed, impossible have rint :: type t
t t ~ int
.
the with
syntax not present in ghc, gadts play same role.
{-# language gadts #-} data type t rint :: t ~ int => type t rchar :: t ~ char => type t rlist :: t ~ [a] => type -> type t rpair :: t ~ (a,b) => type -> type b -> type t
note how with
replaced equality constraint in each constructor. it's same thing, written differently.
more compactly, can rewrite above into
data type t rint :: type int rchar :: type char rlist :: type -> type [a] rpair :: type -> type b -> type (a,b)
where constraints have been "inlined" in final type.
Comments
Post a Comment