type MyType = String | Int

It is legal, but it does NOT do what you think it does. There are NO
non-tagged union types in Elm.

This type definition is no different than "type MyType = Foo | Bar ". It
defines two tags for the type MyType, and the fact that those tags share
the name with the existing types String and Int changes nothing.

If you want "a value that can be a String or an Int", then you can do this:
type MyType = MyString String | MyInt Int

As you've defined it, String and Int as constructors take no arguments, so
you wouldn't be able to store Strings or Ints or any data in them.

Remember, the first word in each Variant of the declaration is the name of
the tag.

For the function you described, with my altered MyType definition, you'd do
something like this:

 myFun : MyType -> MyType
 myFun x = case x of
    MyString s ->MyString (s ++ "x")
    MyInt i -> MyInt (i + 1)

On Fri, Jun 3, 2016 at 2:50 PM, Lambder <[email protected]> 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.
>

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