[Haskell-cafe] Can I specify the a in a phantom type to be limited to a sum type?

Alexander Solla alex.solla at gmail.com
Fri May 15 20:24:21 UTC 2015


Read the paper "Data types a la carte"[1], and check out the compdata[2]
library for an implementation.

The idea is that instead of making a big union type like:

data Answers = SexAnswer | AgeAnswer | etc...

you make

data Sex = M | F | etc

newtype Age = Age Int

and then you construct functions that accept sum types:

ageOrSex :: Age :+: Sex -> m Bool
...

A single type class, called :<: in the paper, handles dispatching from sums
the underlying values to sums.


[1]: http://www.cs.ru.nl/~W.Swierstra/Publications/DataTypesALaCarte.pdf
[2: https://hackage.haskell.org/package/compdata

On Fri, May 15, 2015 at 5:39 AM, Cody Goodman <codygman.consulting at gmail.com
> wrote:

> Tom, I'm trying to make a well-typed API to Question/Answers on
> medical forms. The questions will be lined with a specific code, so I
> want to enforce that certain codes can only contain certain types of
> answers.
>
> Andras, thanks. I'll give that a try later today and let you know how it
> works.
>
> On Fri, May 15, 2015 at 4:12 AM, Andras Slemmer <0slemi0 at gmail.com> wrote:
> > You can do this, although you still need a datastructure that allows you
> to
> > use the contained type:
> >
> > {-# LANGUAGE GADTs #-}
> > {-# LANGUAGE StandaloneDeriving #-}
> > {-# LANGUAGE TypeSynonymInstances #-}
> > module Tutorial where
> >
> > data Gender = Male | Female deriving (Show)
> >
> > data Race = White | Black deriving (Show)
> >
> > type Age = Int
> >
> > data Answer a where
> >   Answer :: RacistAgistSexist a => a -> Answer a
> >
> > deriving instance Show w => Show (Answer w)
> >
> > data GenderRaceAge
> >   = Gender Gender
> >   | Race Race
> >   | Age Age
> >
> > class RacistAgistSexist a where
> >   genderRaceAge :: a -> GenderRaceAge
> > instance RacistAgistSexist Gender where
> >   genderRaceAge = Gender
> > instance RacistAgistSexist Race where
> >   genderRaceAge = Race
> > instance RacistAgistSexist Age where
> >   genderRaceAge = Age
> >
> > -- You can use genderRaceAge to get a GenderRaceAge out of the contained
> > type if you don't know 'a'
> >
> >
> > On 15 May 2015 at 08:51, Tom Ellis
> > <tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk> wrote:
> >>
> >> On Fri, May 15, 2015 at 01:47:49AM -0500, Cody Goodman wrote:
> >> > How can I create Answers of type Gender, Race, or Age?
> >> >
> >> > These should be possible:
> >> >
> >> > λ> Answer Male
> >> > λ> Answer White
> >> > λ> Answer Black
> >> > λ> Answer 28
> >> >
> >> > Others such as using a string should not be possible:
> >> >
> >> > λ> Answer "a string" -- should throw type error
> >>
> >> It would probably help if you tell us why precisely you want this, and
> in
> >> particular why
> >>
> >> data Answer = AnswerGender Gender
> >>             | AnswerRace   Race
> >>             | AnswerAge    Int
> >>
> >> is not satisfactory.
> >>
> >> Tom
> >>
> >> _______________________________________________
> >> Haskell-Cafe mailing list
> >> Haskell-Cafe at haskell.org
> >> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> >
> >
> >
> > _______________________________________________
> > Haskell-Cafe mailing list
> > Haskell-Cafe at haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> >
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20150515/afe957e9/attachment.html>


More information about the Haskell-Cafe mailing list