Or are String and Int on   "type MyType = String | Int" just tags?

On Friday, 3 June 2016 22:50:34 UTC+1, Lambder wrote:
>
> I still like to ask for some clarification.
>
> type MyType = String | Int
>
> is legal type definition in elm. How to define function which accept one 
> parameter of type MyType and if it is String return it with  'x' appended 
> as a result. If it is a number return its increment?
> If what I am asking makes no sense, what are the potential usages of non 
> tagged union types?
>
> --
> Thanks
>
> 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]> 
>> 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.

Reply via email to