On Wednesday, February 15, 2017 at 8:49:13 PM UTC, Rupert Smith wrote:
>
> I am trying to build a model with states, such that fields are only 
> available that are actually needed in the relevant state. The model is like 
> this:
>
> type alias WithPosition a =
>     { a | rect : Rectangle }
>

>
> type alias WithValue a =
>     { a | value : String }
>
>
> type State
>     = Hidden
>     | Aware (WithPosition {})
>     | Active (WithPosition (WithValue {}))
>     | Inactive (WithPosition (WithValue {}))
>

Having played around with this for a while, I don't think this pattern is 
worth continuing with.

It is much easier to use non-extensible records and take advantage of 
tagged union constructors letting you have >1 argument. Like this:

type State
    = Hidden
    | Aware WithPosition
    | Active WithPosition WithValue
    | Inactive WithPosition

(Of course I could just use Rectangle and String directly - but the actual 
model I am working with has more fields)

This avoids the need to unpack and repack record types unnecessarily to try 
and work around the typing issues.

It has been a learning experience to play around with them, but I think 
without an existential qualifier, extensible records are not terribly 
useful at all - except for the simple case where you want to write a 
function that projects the fields of a record onto a sub set. As 
existential qualifier would break type inference and that is too useful - 
so extensible records are best avoided.

-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elm-discuss+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to