[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