What you&#39;re asking for is essentially a dependent type (something where a type depends on a value). Haskell doesn&#39;t support these, but can approximate them with GADTs:<div><br></div><div><br></div><div><div>{-# LANGUAGE GADTs, EmptyDataDecls, KindSignatures, Rank2Types #-}</div>
<div><br></div><div>data A</div><div>data B</div><div><br></div><div>-- The data constructors refine the type index</div><div>data X :: * -&gt; * where</div><div>  A :: X A</div><div>  B :: X B</div><div><br></div><div>-- We can&#39;t return a different type based on the input string (unless you represent the string as some complex GADT that itself refines the output type), so instead we have a pseudo-existential type represented as a polymorphic function parameter.</div>
<div>-- This basically says, &quot;if you give me a string and a function that can work on X n for all values of n, I&#39;ll give you something of the same type as the return value of that function&quot;</div><div>op :: String -&gt; (forall n. X n -&gt; r) -&gt; r</div>
<div>op &quot;a&quot; f = f A</div><div>op &quot;b&quot; f = f B</div><div><br></div><div><br></div></div><div>If you give a more detailed example of what you need, we might be able to tell you better approaches, though. This rank-2/existential approach is mostly useful for preserving internal (hidden from the end-user) type-level constraints on GADT indices.</div>
<div><br><br><div class="gmail_quote">On Thu, Sep 2, 2010 at 10:31 PM, Andrew U. Frank <span dir="ltr">&lt;<a href="mailto:frank22@geoinfo.tuwien.ac.at">frank22@geoinfo.tuwien.ac.at</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
I have a user input (string) and need to select one of two types.<br>
depending what the input is. is this possible?<br>
<br>
data A<br>
data B<br>
<br>
data X n = X String<br>
<br>
op :: String -&gt; X n<br>
op &quot;a&quot; = X &quot;a&quot; :: X A<br>
op &quot;b&quot; = X &quot;b&quot; :: X B<br>
<br>
this does obviously not compile. is there a way to achieve that the type<br>
X A is produced when the input is &quot;a&quot; and X B when the input is &quot;b&quot;?<br>
<br>
thank you for help!<br>
andrew<br>
<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br></div>