<div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Hi Fredric,</div><div><br></div><div>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.</div><div><br></div><div>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.</div><div><br></div><div>Hope it helps, code follows:<br></div><br><div dir="ltr"><br></div><div dir="ltr">data A t = A String<br><br>data Unchecked<br>data Hdf5<br>data Cbf<br><br>-- * A with GADT<br><br>data A' where<br>  AHdf5 :: A Hdf5 -> A'<br>  ACbf :: A Cbf -> A'<br>  AUnchecked :: A Unchecked -> A'<br><br>check :: A Unchecked -> A'<br>check a = case a of<br>  A str | suffix ".h5" -> AHdf5 (A str)<br>        | suffix ".cdf" -> ACbf (A str)<br>        | otherwise -> AUnchecked (A str)<br>    where<br>      suffix suf = suf `isSuffixOf` str<br><br>-- * Type classes<br><br>type SomethnigCommon = ()<br><br>class Continue a where<br>  go :: A a -> SomethnigCommon<br>instance Continue Hdf5 where<br>  go (A hdf5) = undefined -- implementation for hdf5 here<br>instance Continue Cbf where<br>  go (A cbf) = undefined -- implementation for cbf here<br>instance Continue Unchecked where<br>  go (A unchecked) = undefined -- implementation for unchecked here<br><br>check' :: A Unchecked -> SomethnigCommon<br>check' a = case a of<br>  A str | suffix ".h5" -> go (A str :: A Hdf5)<br>        | suffix ".cdf" -> go (A str :: A Cbf)<br>        | otherwise -> go (A str :: A Unchecked)<br>    where<br>      suffix suf = suf `isSuffixOf` str<br><div dir="ltr"><br></div><div dir="ltr"><br></div><div dir="ltr"><br><div class="gmail_quote"><div dir="ltr">On Tue, Oct 2, 2018 at 6:48 PM PICCA Frederic-Emmanuel <<a href="mailto:frederic-emmanuel.picca@synchrotron-soleil.fr">frederic-emmanuel.picca@synchrotron-soleil.fr</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello<br>
<br>
<br>
suppose that I have a bunch  of type like this<br>
<br>
data Unchecked<br>
data Hdf5<br>
data Cbf<br>
<br>
data A t > A String<br>
<br>
The A thing come from a database as A Unchecked<br>
<br>
now if I read the String and it ends with  .h5, I have a A Hdf5 type<br>
and If the string end with .cbf, I have a A Cbf.<br>
<br>
So I would like a function which allow to return a A Hdf5 or a A Cbf depending on the String content.<br>
<br>
check :: A Unchecked -> A ???<br>
check = ???<br>
<br>
Is it possible to do this ?<br>
<br>
Thanks<br>
<br>
Frederic<br>
<br>
PS: At the end I will have more tha one tag.<br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">Markus Läll<br></div></div></div></div></div></div>