<div dir="ltr">I recommend posting this question to StackOverflow and hoping that Conor McBride notices it.</div><br><div class="gmail_quote"><div dir="ltr">On Fri, Jul 7, 2017 at 11:46 AM Clinton Mead <<a href="mailto:clintonmead@gmail.com">clintonmead@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi Erik and All<div><br></div><div>I don't think "indexed-core" is what I'm looking for. "indexed-code" refers to the following type:</div><div><br></div><div><span style="background-color:rgb(255,255,255)"><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px">> (a </span><a href="http://hackage.haskell.org/package/index-core-1.0.4/docs/Control-Category-Index.html#t::-45--62-" style="margin:0px;padding:0px;text-decoration-line:none;color:rgb(171,105,84);font-family:monospace;font-size:13px" target="_blank">:-></a><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px"> b) -> f a </span><a href="http://hackage.haskell.org/package/index-core-1.0.4/docs/Control-Category-Index.html#t::-45--62-" style="margin:0px;padding:0px;text-decoration-line:none;color:rgb(171,105,84);font-family:monospace;font-size:13px" target="_blank">:-></a><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px"> f b</span><br></span></div><div><span style="background-color:rgb(255,255,255)"><br></span></div><div><span style="background-color:rgb(255,255,255)">Where:</span></div><div><span style="background-color:rgb(255,255,255)"><br></span></div><div><span style="background-color:rgb(255,255,255)"><span class="m_-7155334709085056975gmail-keyword" style="margin:0px;padding:0px;color:rgb(0,0,0);font-family:monospace;font-size:13px">> type</span><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px"> </span><a id="m_-7155334709085056975gmail-t::-45--62-" class="m_-7155334709085056975gmail-def" style="margin:0px;padding:0px;font-weight:bold;color:rgb(0,0,0);font-family:monospace;font-size:13px">(:->)</a><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px"> a b = </span><span class="m_-7155334709085056975gmail-keyword" style="margin:0px;padding:0px;color:rgb(0,0,0);font-family:monospace;font-size:13px">forall</span><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px"> i. a i -> b i</span></span><br></div><div><br></div><div>This effectively makes the result of the functor:</div><div><br></div><div><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace">> (forall i1. (a i1 -> b i1)) -> (forall i2. (f a i2 -></span><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace"> f b i2))</span><br></div><div><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace"><br></span></div><div><div>But what I want is subtly different:</div></div><div><br></div><div><div><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace">> (forall i. (a i -> b i)) -> f a -></span><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace"> f b</span><br></div></div><div><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace"><br></span></div><div><div>Indeed, with my code, "<span style="color:rgb(0,0,0);font-family:monospace;font-size:13px">f a i"</span> doesn't make much sense as "<span style="color:rgb(0,0,0);font-family:monospace;font-size:13px">f a" </span>itself is of type *. </div></div><div class="gmail_extra"><br></div><div class="gmail_extra">What I'd find useful is something like the following:</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra"><font face="monospace, monospace">> class HighFunctor f where</font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">  hfmap :: (forall a. t a -> u a) -> f t -> f u</font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">> </span><font face="monospace, monospace"><br></font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">class HighFunctor2 f where</font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">  hfmap2 :: (forall a. t a -> u a -> v a) -> f t -> f u -> f v</font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">> </span><font face="monospace, monospace"><br></font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">class HighFunctorMaybe f where</font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">  hfmapMaybe :: (forall a. Maybe (t a) -> u a) -> Maybe (f t) -> f u</font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">> </span><font face="monospace, monospace"><br></font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">class HighFunctor2Maybe1 f where</font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">  hfmap2maybe1 :: (forall a. Maybe (t a) -> u a -> v a) -> Maybe (f t) -> f u -> f v</font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">  </font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">class HighFunctor2Maybe2 f where</font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">  hfmap2maybe2 :: (forall a. t a -> Maybe (u a) -> v a) -> f t -> Maybe (f u) -> f v</font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">> </span><font face="monospace, monospace"><br></font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">class HighFunctor2MaybeBoth f where</font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">  hfmap2maybeBoth :: (forall a. Maybe (t a) -> Maybe (u a) -> v a) -> Maybe (f t) -> Maybe (f u) -> f v</font></div><div><br></div><div>As you can see. I'm basically hacking up with separate classes what can be done easily with applicative, and it's getting a bit messy. I've been trying to clean this up, so I don't need so many different functions for different combinations of maybes, by defining these helper functions:</div><div><br></div><div><div><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">data Transform outerT innerT a = Transform (outerT (innerT a))</font></div><div><span style="font-family:monospace,monospace">> </span><font face="monospace, monospace"><br></font></div><div><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">transformIn :: outerT (f innerT) -> f (Transform outerT innerT)</font></div><div><span style="font-family:monospace,monospace">> </span><font face="monospace, monospace"><br></font></div><div><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><span style="font-family:monospace,monospace">transformOut</span><font face="monospace, monospace"> :: Transform outerT innerT a -> outerT (innerT a)</font></div><div><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><span style="font-family:monospace,monospace">transformOut</span><font face="monospace, monospace"> (Transform x) = x</font></div></div><div><br></div><div>By applying "transformIn" to an argument on the way in to hfmapN, and "transformOut" on the way out, one can pass through maybes to the standard top to non-maybe "HighFunctor" instances. </div><div><br></div><div>But note that whilst "transformOut" is always trivial to implement, the way in, "transformIn" doesn't seem trivial. "transformIn" I think has to be implemented for each combination of "outerT" and "f", like so:</div><div><br></div><div><div><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">class TransformIn outerT f where</font></div><div><span style="font-family:monospace,monospace">></span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace">  f :: outerT (f innerT) -> f (Transform outerT innerT)</font></div></div><div><br></div><div>Anyway, the point of all this is that I'd like to be able to just launch my base functions (over the "forall i" space) into these higher level datatypes that wrap the foralls up in a datatype, in a similar way I can do so with functor and applicative. </div><div><br></div><div>I think the code in the first post is the best illustration of what I'm trying to achieve but with two added things:</div><div><br></div><div>1. The ability to deal with multiple arguments in an applicative style <$> <*> way</div></div><div class="gmail_extra">2. The ability to promote "wrapped" types, I think kind of in a way "traversable" does.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Sorry if this all is a bit vague, but hopefully the code in the first post and this gives the gist of what I'm trying to achieve.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Any help or ideas appreciated.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Thanks,</div><div class="gmail_extra"><br></div><div class="gmail_extra">Clinton</div></div><div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 7, 2017 at 4:40 PM, Erik Hesselink <span dir="ltr"><<a href="mailto:hesselink@gmail.com" target="_blank">hesselink@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div>I think the keyword you're looking for might be 'indexed', although that also seems to be used for something different (two indices for pre and post conditions). Your functor seems to be in 'index-core' [0], and probably other places (it seems there was something in category-extras but it's unclear where it went).<br><br></div>Regards,<br><br></div>Erik<br><div><div><br>[0] <a href="http://hackage.haskell.org/package/index-core-1.0.4/docs/Control-IMonad-Core.html" target="_blank">http://hackage.haskell.org/package/index-core-1.0.4/docs/Control-IMonad-Core.html</a><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="m_-7155334709085056975gmail-h5">On 7 July 2017 at 06:48, Clinton Mead <span dir="ltr"><<a href="mailto:clintonmead@gmail.com" target="_blank">clintonmead@gmail.com</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div class="m_-7155334709085056975gmail-h5"><div dir="ltr"><div>Consider the illustrative code below: </div><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace"><br></font></div><div><div><font face="monospace, monospace">{-# LANGUAGE GADTs #-}</font></div></div><div><div><font face="monospace, monospace">{-# LANGUAGE DataKinds #-}</font></div></div><div><div><font face="monospace, monospace">{-# LANGUAGE KindSignatures #-}</font></div></div><div><div><font face="monospace, monospace">{-# LANGUAGE RankNTypes #-}</font></div></div><div><div><font face="monospace, monospace">{-# LANGUAGE PolyKinds #-}</font></div></div><div><div><font face="monospace, monospace">{-# LANGUAGE StandaloneDeriving #-}</font></div></div><div><div><font face="monospace, monospace">{-# LANGUAGE UndecidableInstances #-}</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">data Param = Param1 | Param2</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">data T (p :: Param) where</font></div></div><div><div><font face="monospace, monospace">  TInt :: Int -> T Param1</font></div></div><div><div><font face="monospace, monospace">  TInteger :: Integer -> T Param1</font></div></div><div><div><font face="monospace, monospace">  TBool :: Bool -> T Param2</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">data U (p :: Param) where</font></div></div><div><div><font face="monospace, monospace">  UDouble :: Double -> U Param1</font></div></div><div><div><font face="monospace, monospace">  UString :: String -> U Param2</font></div></div><div><div><font face="monospace, monospace">  </font></div></div><div><div><font face="monospace, monospace">data F (t :: Param -> *) where</font></div></div><div><div><font face="monospace, monospace">  F :: t Param1 -> t Param2 -> F t</font></div></div><div><div><font face="monospace, monospace">  </font></div></div><div><div><font face="monospace, monospace">f :: T a -> U a</font></div></div><div><div><font face="monospace, monospace">f (TInt x) = UDouble (fromIntegral x)</font></div></div><div><div><font face="monospace, monospace">f (TInteger x) = UDouble (fromIntegral x)</font></div></div><div><div><font face="monospace, monospace">f (TBool x) = UString (show x)</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">class MyFunctor f where</font></div></div><div><div><font face="monospace, monospace">  myFmap :: (forall a. t a -> u a) -> f t -> f u</font></div></div><div><div><font face="monospace, monospace">  </font></div></div><div><div><font face="monospace, monospace">instance MyFunctor F where</font></div></div><div><div><font face="monospace, monospace">  myFmap f (F x1 x2) = F (f x1) (f x2)</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">deriving instance Show (U a)</font></div></div><div><div><font face="monospace, monospace">deriving instance (Show (t Param1), Show (t Param2)) => Show (F t)</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">main = print $ myFmap f (F (TInt 42) (TBool False))</font></div></div></blockquote></div><div><br></div><div>Basically this is a sort of "higher order" functor, but I can't seem to fit it into an ordinary functor. </div><div><br></div><div>But it seems like I'm reinventing the wheel, as my code is suspiciously like `Functor` but only slightly different. </div><div><br></div><div>Has this sort of class already been created and if so what package is it in?</div><div><br></div><div><br></div></div>
<br></div></div>_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.<br></blockquote></div><br></div>
</blockquote></div><br></div></div>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div>