Phantom Types in Gleam
blog.pd-andy.dev
Phantom Types in Gleam
1–10 of 13 posts
Re: Phantom Types in Gleam
#2I used to use it extensively in C++: beware though of (super long) compile errors while nesting them through templates params. :)
Edit: I was wrapping pointers for instance to not mix GPU and CPU memory addresses, to define a unidirectional flow of memory transfers between devices (and avoid manual synchronisation and tracking)... etc.
You could somehow define a state machine through types and ensure compositional coherence.
Re: Phantom Types in Gleam
#3The answer is structural typing (aka duck typing).
Re: Phantom Types in Gleam
#4This is a good post and technique in general. I used to use it extensively in C++: beware though of (super long) compile errors while nesting them through templates params. :) Edit: I was wrapping pointers for instance to not mix GPU and CPU memory addresses, to define a unidirectional flow of memory transfers between devices (and avoid manual synchronisation and tracking)... etc. You could somehow define a state mac…
[1]: https://gist.github.com/rupertlssmith/88946c8d207d7ad64daf43...
Re: Phantom Types in Gleam
#5It's kind of amusing reading this as a Typescript dev because I'm so used to Typescript's expressiveness I couldn't really work out which trick it was trying to tell me was novel. The answer is structural typing (aka duck typing).
In a language with structural typing, two types are considered equivalent if they share the same structure. With phantom types we can have a single structure and disambiguate between different uses without touching the underling structure. There's no difference between Id(User) and Id(Post) at runtime, the annotation is purely a compile-time restraint.
In fact, because of typescript's structural typing, the only way to use phantom types in ts is to have some dummy field of type `never` that the type system can use to disambiguate between the two [1].
[1]: https://gist.github.com/GoNZooo/243b23702df1fae38c966ae18832...
Re: Phantom Types in Gleam
#6Re: Phantom Types in Gleam
#7It's kind of amusing reading this as a Typescript dev because I'm so used to Typescript's expressiveness I couldn't really work out which trick it was trying to tell me was novel. The answer is structural typing (aka duck typing).
Not quite. I guess in some ways phantom types achieve the opposite of structural typing. In a language with structural typing, two types are considered equivalent if they share the same structure. With phantom types we can have a single structure and disambiguate between different uses without touching the underling structure. There's no difference between Id(User) and Id(Post) at runtime, the annotation is purely a…
Btw. is there a difference between these two:
(s: string): PlainText => s;
(s: string): PlainText => s as any as PlainText;
Syntax-wise I'd rather use the latter for it's more clear in typed JSX-context.Re: Phantom Types in Gleam
#8Earlier quoted context omitted.
Not quite. I guess in some ways phantom types achieve the opposite of structural typing. In a language with structural typing, two types are considered equivalent if they share the same structure. With phantom types we can have a single structure and disambiguate between different uses without touching the underling structure. There's no difference between Id(User) and Id(Post) at runtime, the annotation is purely a…
Holy smokes, that would be irritating :D Btw. is there a difference between these two: (s: string): PlainText => s; (s: string): PlainText => s as any as PlainText; Syntax-wise I'd rather use the latter for it's more clear in typed JSX-context.
Re: Phantom Types in Gleam
#9It's kind of amusing reading this as a Typescript dev because I'm so used to Typescript's expressiveness I couldn't really work out which trick it was trying to tell me was novel. The answer is structural typing (aka duck typing).
Not quite. I guess in some ways phantom types achieve the opposite of structural typing. In a language with structural typing, two types are considered equivalent if they share the same structure. With phantom types we can have a single structure and disambiguate between different uses without touching the underling structure. There's no difference between Id(User) and Id(Post) at runtime, the annotation is purely a…
Re: Phantom Types in Gleam
#10https://stackoverflow.com/questions/3730019/why-not-use-doub...