Thank you very much for this explanation. I'm still new to elm but your 
post clarified that part I was missing.

On Friday, 3 June 2016 22:25:59 UTC+1, Joey Eremondi wrote:
>
> The problem here is that you're confusing Types (which you can never 
> pattern match on) with Value Constructors, which are the only things you 
> can pattern match on.
>
> When you declare a "type", you need to give a distinct tag name to each 
> variant.
>
> Each "type" declaration has the form
>   type Name typeArg1 ... typeArgn = Variant1 | ... | Variant_n
> where each variant has the form
>   TagName arg1 ... arg_n
>
> So when you write
>    type PageDef a m = ModelAndView a m | Html a
> You're saying:
>   PageDef is a type constructor that takes two type arguments, a and m. It 
> has to variants: the first has a tag named ModelAndView, which takes two 
> arguments, an "a" and an "m". The second is a type constructor named Html, 
> which takes a single argument of type "a".
>
> What you probably want is something like this:
>   type PageDef a m = TagName1 (MyModelAndView a m) | TagName2 (Html a)
>
> I don't know what your program does, so I don't know what appropriate tag 
> names would be.
>
> Then, to pattern match, you do:
> viewChild : PageDef a m -> Html a
> viewChild pageDef =
>   case pageDef of
>     TagName1 (m,v) -> 
>       v m
>     TagName2 h -> h
>
> Elm only supports Tagged unions: when something can be an A or a B, you 
> need a tag to indicate which it is.
>
> Also remember that Types and Value Constructors (tags) exist in totally 
> separate namespaces! So in your original definition, you had defined two 
> things, both named MyModelAndView. One was a type alias for (m, View a m) and 
> the other was a type constructor for the type PageDef.
>
> The names of types will only occur in type signatures, never in the bodies 
> of functions. Value constructors can be used in functions, or on the 
> left-hand side of a pattern match, and will never occur in type signatures.
>
> It's generally bad practice to share names between these two namespaces, 
> unless you have a type with a single consructor. For example:
>   type NumPixels = NumPixels Int
> Defines a new type that is just a shallow wrapper around an Int, that 
> creates a new type storing an Int. But again, there's no magic here, the 
> type name NumPixels is completely separate from the tag name NumPixels.
>
> On Fri, Jun 3, 2016 at 2:12 PM, Daniel Kwiecinski <[email protected] 
> <javascript:>> wrote:
>
>> Hi Elmers,
>>
>>
>>    How do I pattern match on aliased types? E.g lets assume I have the 
>> following type definitions:
>>
>> type alias View a m = m -> Html a               -- view is a function 
>> which turns a model (m) into html (Html a)
>> type alias ModelAndView a m = (m, View a m)     -- a pair of a model and 
>> a view
>> type PageDef a m = ModelAndView a m | Html a    -- algebraic type for 
>> unrealised html (model+view) and realised html
>>
>>
>> how do I pattern match on PageDef ?
>>
>>
>> viewChild : PageDef a m -> Html a
>> viewChild pageDef =
>>   case pageDef of
>>     ModelAndView a m as m_v -> 
>>       case m_v of
>>          (m, v) -> v m       -- !!!  GOT AN ERROR HERE !!!
>>     Html a as h -> h
>>
>>  Is it even possible to pattern match directly?
>>
>> Regards,
>> Daniel
>>
>> -- 
>> 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 [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to