[Haskell-beginners] Tagged types

Markus Läll markus.l2ll at gmail.com
Mon Oct 29 18:42:14 UTC 2018


Hi Fredric,

below are two ways to solve it, first with GADTs, the other with type
classes. But I think in both cases you need to define the specific handling
of the types in multiple places. With GADT's you need to add yet another
constructor for yet another `t`. With type classes you need to specify the
type in-line at the place you branch off, not sure how elegant that is.

The singleton based approach is perhaps better than both of the below if
your set of types is closed, since you only keep the string in one data
constructor (in the `A "here"`), while with a GADT you have it nested in
one of the AHdf5 or ACbf. On the other hand singletons need some extensions
to be turned.

Hope it helps, code follows:


data A t = A String

data Unchecked
data Hdf5
data Cbf

-- * A with GADT

data A' where
  AHdf5 :: A Hdf5 -> A'
  ACbf :: A Cbf -> A'
  AUnchecked :: A Unchecked -> A'

check :: A Unchecked -> A'
check a = case a of
  A str | suffix ".h5" -> AHdf5 (A str)
        | suffix ".cdf" -> ACbf (A str)
        | otherwise -> AUnchecked (A str)
    where
      suffix suf = suf `isSuffixOf` str

-- * Type classes

type SomethnigCommon = ()

class Continue a where
  go :: A a -> SomethnigCommon
instance Continue Hdf5 where
  go (A hdf5) = undefined -- implementation for hdf5 here
instance Continue Cbf where
  go (A cbf) = undefined -- implementation for cbf here
instance Continue Unchecked where
  go (A unchecked) = undefined -- implementation for unchecked here

check' :: A Unchecked -> SomethnigCommon
check' a = case a of
  A str | suffix ".h5" -> go (A str :: A Hdf5)
        | suffix ".cdf" -> go (A str :: A Cbf)
        | otherwise -> go (A str :: A Unchecked)
    where
      suffix suf = suf `isSuffixOf` str



On Tue, Oct 2, 2018 at 6:48 PM PICCA Frederic-Emmanuel <
frederic-emmanuel.picca at synchrotron-soleil.fr> wrote:

> Hello
>
>
> suppose that I have a bunch  of type like this
>
> data Unchecked
> data Hdf5
> data Cbf
>
> data A t > A String
>
> The A thing come from a database as A Unchecked
>
> now if I read the String and it ends with  .h5, I have a A Hdf5 type
> and If the string end with .cbf, I have a A Cbf.
>
> So I would like a function which allow to return a A Hdf5 or a A Cbf
> depending on the String content.
>
> check :: A Unchecked -> A ???
> check = ???
>
> Is it possible to do this ?
>
> Thanks
>
> Frederic
>
> PS: At the end I will have more tha one tag.
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>


-- 
Markus Läll
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20181029/fb2b0b01/attachment.html>


More information about the Beginners mailing list