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]> 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].
> 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.