<div dir="auto">The main challenge is that, last I checked, stack didn't support backpack at all. This makes it a hard sell.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Sep 11, 2021, 5:59 AM Jaro Reinders <<a href="mailto:jaro.reinders@gmail.com">jaro.reinders@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I'm playing around with backpack, trying to rewrite existing libraries. My end <br>
goal is to see if Backpack could improve the primitive library. Right now, the <br>
primitive library (in my opinion) relies too heavily on specialization of its <br>
type classes, so I think Backpack could help. However, I seem to be running <br>
into a limitation. I am wondering if it is a fundamental limitation, if perhaps <br>
there is a workaround, or if Backpack could be improved to support this use-case.<br>
<br>
Instead of primitive, I will take the simpler example: semigroup, which also <br>
shows this limitation. Let's convert the Semigroup class to a backpack signature:<br>
<br>
     unit indef where<br>
       signature Semigroup where<br>
         import Prelude hiding ((<>))<br>
         data T<br>
         (<>) :: T -> T -> T<br>
<br>
The problem is how to implement this signature with the type of polymorphic <br>
lists. It is easy to implement it for concrete lists like strings:<br>
<br>
     unit string where<br>
      module Semigroup where<br>
       import Prelude hiding ((<>))<br>
       type T = String<br>
       (<>) :: T -> T -> T<br>
       (<>) = (++)<br>
<br>
It is also possible to implement it in terms of another signature:<br>
<br>
     unit list where<br>
       signature Elem where<br>
         data A<br>
<br>
       module Semigroup where<br>
         import Prelude hiding ((<>))<br>
         import Elem<br>
         type T = [A]<br>
         (<>) :: T -> T -> T<br>
         (<>) = (++)<br>
<br>
This is still problematic, because it is annoying that this new type A needs to <br>
be instantiated each time you want to use it. However, even more importantly, <br>
if I want to translate the 'PrimMonad' class to a Backpack signature then the <br>
'ST s' instance needs a polymorphic type variable 's', which cannot be made <br>
concrete.<br>
<br>
And do note that I want the monad to be concrete for performance reasons, but <br>
the 's' parameter doesn't have to be concrete, because it is a phantom <br>
parameter anyway. And for lists making the 'a' parameter concrete also would <br>
not improve performance as far as I know.<br>
<br>
One possible way to fix this is to add a type variable in the 'Semigroup' <br>
signature, but then I think it becomes impossible to write the 'String' <br>
instance and sometimes you need more than one new type variable such as with <br>
the 'ReaderT r (ST s)' instance of 'PrimMonad'.<br>
<br>
In OCaml you can still kind of work around this problem by creating local <br>
instances inside functions. That trick still allows you to write a polymorphic <br>
concatenation function using a monoid signature (taken from [1]):<br>
<br>
     let concat (type a) xs =<br>
       let module MU = MonoidUtils (ListMonoid(struct type t = a end)) in<br>
       MU.concat xs;;<br>
<br>
So, I'm wondering if it would be possible to "generalise" over indefinite <br>
Backpack types such as 'A' in the 'Elem' signature above or if we can at least <br>
implement something which enables the same trick that you can use in OCaml.<br>
<br>
Thanks,<br>
<br>
Jaro<br>
<br>
[1] <a href="https://blog.shaynefletcher.org/2017/05/more-type-classes-in-ocaml.html" rel="noreferrer noreferrer" target="_blank">https://blog.shaynefletcher.org/2017/05/more-type-classes-in-ocaml.html</a><br>
_______________________________________________<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 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>