Hello Timothy

GADTs let you catch more errors at compile time. With them you can give different types to constructors of the same datatype.

regards
paolino
2012/8/31 <timothyhobbs@seznam.cz>

Sure, but that's relying on the promise that you're passing it a valid BadFrog...  Consider then:


deBadFrog $ BadFrogType (BadBar { badFoo = 1})


---------- Původní zpráva ----------
Od: John Wiegley <johnw@newartisans.com>
Datum: 31. 8. 2012
Předmět: Re: [Haskell-cafe] Over general types are too easy to make.

>>>>> <timothyhobbs@seznam.cz> writes:

>> data BadFoo =
>> BadBar{
>> badFoo::Int} |
>> BadFrog{
>> badFrog::String,
>> badChicken::Int}

> This is fine, until we want to write a function that acts on Frogs but not
> on Bars. The best we can do is throw a runtime error when passed a Bar and
> not a Foo:

You can use wrapper types to solve this:

data BadBarType = BadBarType BadFoo
data BadFrogType = BadFrogType BadFoo

Now you can have:

deBadFrog :: BadFrogType -> String

And call it as:

deBadFrog $ BadFrogType (BadFrog { badFrog = "Hey", badChicken = 1})

Needless to say, you will have to create helper functions for creating Bars
and Frogs, and not allow your BadBar or BadFrog value constructors to be
visible outside your module.

John

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe