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.
