[Haskell-beginners] pattern matching on a common element

briand at aracnet.com briand at aracnet.com
Fri Nov 25 16:20:29 UTC 2016


On Fri, 25 Nov 2016 10:19:14 +0100
Daniel Trstenjak <daniel.trstenjak at gmail.com> wrote:

> Hi Rahul,
> 
> On Fri, Nov 25, 2016 at 12:06:06PM +0530, Rahul Muttineni wrote:
> > data X =
> >   A1 { name :: String, d :: Double}
> > | A2 { name :: String, i :: Int}
> > | A3 { name :: String, d1 :: Double, i1 :: Int}
> > 
> > Now you can use `name` directly to get the string component of the different
> > variants.  
> 
> It's not recommended to mix record syntax and ADTs, because you
> can get runtime errors that the compiler can't catch during compile
> time, like calling:
> 
>    i (A1 "foo" 3.2)
> 

agreed.  I'm doing this as a form of shorthand instead of creating a text file based input and parsing it.  Having any sort of type checking is an advantage.

> If you're having the same field in all variants, then an
> other approach might be better:
> 
>    data A = Ai Int | Ad Double | Aid Int Double
> 
>    data X = X { name :: String, a :: A }
> 

yes, that would be better.

interestingly in my journeys through the intertubes I have not found a single mention of using the "()" syntax in place of the "{fieldname=value, ...}" syntax as the generator.


Brian



More information about the Beginners mailing list