<div dir="ltr">Now we're definitely getting somewhere! I'm not to thrilled about the use of string literals though. How about this?<div><br></div><div><div>{-# LANGUAGE TypeOperators, DataKinds, RankNTypes #-}</div><div>type (l ∷ t) = t</div><div><br></div><div>foo :: forall red green blue. (red ∷ Double) -> (green ∷ Double) -> (blue ∷ Double) -> IO ()</div><div><br></div><div>We just need to patch hlint to make this the suggested style.<div><br></div><div>- jeremy</div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jan 18, 2015 at 7:05 PM, Niklas Haas <span dir="ltr"><<a href="mailto:haskell@nand.wakku.to" target="_blank">haskell@nand.wakku.to</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Mon, 19 Jan 2015 01:12:58 +0100, Christopher Done <<a href="mailto:chrisdone@gmail.com">chrisdone@gmail.com</a>> wrote:<br>
> ><br>
> > foo : (x : Int) -> (y : Int) -> (red : Double) -> (blue : Double) -><br>
> > (green : Double) -> IO ()<br>
> ><br>
> > And that will solve everything! What could possibly go wrong!<br>
> ><br>
><br>
> How about a type-level the? =p<br>
><br>
> type The label t = t<br>
><br>
> foo :: The red Double -> The green Double -> The blue Double -> IO ()<br>
><br>
> Or with polykinds:<br>
><br>
> foo :: The "Red" Double -> The "Green" Double -> The "Blue" Double -> IO ()<br>
<br>
</div></div>Clearly needs more TypeOperators.<br>
<br>
type (l ∷ t) = t<br>
<br>
foo :: ("red" ∷ Double) -> ("green" ∷ Double) -> ("blue" ∷ Double) -> IO ()<br>
<div class="HOEnZb"><div class="h5">_______________________________________________<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>
</div></div></blockquote></div><br></div>