[HN Gopher] Phantom Types in Gleam
       ___________________________________________________________________
        
       Phantom Types in Gleam
        
       Author : pd-andy
       Score  : 29 points
       Date   : 2021-02-27 14:17 UTC (8 hours ago)
        
 (HTM) web link (blog.pd-andy.dev)
 (TXT) w3m dump (blog.pd-andy.dev)
        
       | muglug wrote:
       | Amusing to see "even PHP" in there, as the author of the static
       | analysis tool that makes that possible.
        
       | rq1 wrote:
       | This 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 machine through types and ensure
       | compositional coherence.
        
         | pd-andy wrote:
         | Using phantom types in state machine transitions is really
         | cool, yeah. I came across a little gist that explored that idea
         | in Elm [1] the other day, actually.
         | 
         | [1]:
         | https://gist.github.com/rupertlssmith/88946c8d207d7ad64daf43...
        
       | Vanit wrote:
       | It'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).
        
         | [deleted]
        
         | pd-andy wrote:
         | 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 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...
        
           | timdeve wrote:
           | Yes, exactly, it's because of Structural Typing that you have
           | to implement Phantom Types in that hacky way rather than
           | Structural Typing being the "trick".
        
           | mushishi wrote:
           | Holy smokes, that would be irritating :D
           | 
           | Btw. is there a difference between these two:
           | (s: string): PlainText => <PlainText><any>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.
        
             | pd-andy wrote:
             | As far as I know those two are equivalent. Definitely
             | slightly clunkier, but is what it is.
        
       | daniel5151 wrote:
       | I know it's a toy example, but it's a _really bad idea_ to use a
       | float as a backing type for currency.
       | 
       | https://stackoverflow.com/questions/3730019/why-not-use-doub...
        
         | heavenlyblue wrote:
         | Have you worked in finance?
        
         | pd-andy wrote:
         | Ha yes, very true!
        
       ___________________________________________________________________
       (page generated 2021-02-27 23:02 UTC)