can/should Functor have a quantified coercible constraint?

Hey everyone! for context, I have some code where I was seeing how far coerce lets me go to avoid doing wrappers for certain codes, i found i had to write the following (mapping an operation over to its newtyped sibling) ``` -- > :t QRA.wither --- forall a b f . Applicative f => (a -> f (Maybe b)) -> RAList a -> f (RAList b) --- wither :: forall a b f . (Applicative f, (forall c d . Coercible c d => Coercible (f c) (f d)) ) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ``` i'd much rather be able to write ``` wither :: forall a b f . (Applicative f) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ``` this seems like it'd be best done via something like changing the functor class definition to ``` class (forall c d . Coercible c d => Coercible (f c) (f d)) ) => Functor f where .. ``` is there any specific reason why this is not feasible? I cant think of a GADT where this wouldn't be totally safe to do (because unlike in foldable, f is in both the domain and co-domain), but maybe i'm not being imaginative enough? look forward to learning what our obstacles are to making this happen for ghc 9.2 :) -Carter

You're not being very imaginative at all. Try out, oh, `StateT s Maybe`. Or
play around with a nice fake functor like the magma used to implement
`traverseBia` in `bifunctors`—pretty sure that won't work out.
On Sun, Jan 3, 2021, 11:00 AM Carter Schonwald
Hey everyone!
for context, I have some code where I was seeing how far coerce lets me go to avoid doing wrappers for certain codes,
i found i had to write the following (mapping an operation over to its newtyped sibling)
``` -- > :t QRA.wither --- forall a b f . Applicative f => (a -> f (Maybe b)) -> RAList a -> f (RAList b) --- wither :: forall a b f . (Applicative f, (forall c d . Coercible c d => Coercible (f c) (f d)) ) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
i'd much rather be able to write ``` wither :: forall a b f . (Applicative f) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
this seems like it'd be best done via something like changing the functor class definition to
``` class (forall c d . Coercible c d => Coercible (f c) (f d)) ) => Functor f where .. ```
is there any specific reason why this is not feasible? I cant think of a GADT where this wouldn't be totally safe to do (because unlike in foldable, f is in both the domain and co-domain), but maybe i'm not being imaginative enough?
look forward to learning what our obstacles are to making this happen for ghc 9.2 :)
-Carter
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Hey David,
could you exposit what would go wrong? a concrete proof witness or
explanation would help me a lot. other people might benefit too.
for the stateT s Maybe a, perhaps i'm still waking up this AM, so let me
try
newtype StateT s m a = StateT {runStateT :: s -> m (a, s)}
so this should expand to
'(s -> Maybe (a,s)),'
but the coerce would be on the 'a' here ... so i'm not seeing the issue?
the latter example seem to boil down to "a free appplicative/functor Gadt"
with some extra bits, though i've not worked through to seeing the unsafety
for the latter examples, the definitions are the following :
traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
:: (Traversable t
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...,
Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
=> (a
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
-> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBia
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
= inline (traverseBiaWith
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
traverse)
--------
traverseBiaWith
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
:: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....
Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
=> (forall f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....
Applicative f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
=> (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
-> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...))
-> (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
-> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBiaWith
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
= smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
-------
smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
:: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....
Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
=> (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
-> (forall x
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....
Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...))
-> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)smash
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
= go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
where go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
:: forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....
Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
(Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
= bipure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
(Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
= bimap f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
(Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
= go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
<<*>> https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
#if MIN_VERSION_base(4,10,0) go
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
(LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
= biliftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
(go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
#endif go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
(One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
_) = p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
_ _ = impossibleError
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
---- and then the magma is
-- This is used to reify a traversal for 'traverseBia'. It's a
somewhat-- bogus 'Functor' and 'Applicative' closely related to
'Magma' from the-- @lens@ package. Valid traversals don't use (<$),
(<*), or (*>), so-- we leave them out. We offer all the rest of the
Functor and Applicative-- operations to improve performance: we
generally want to keep the structure-- as small as possible. We might
even consider using RULES to widen lifts-- when we can:---- liftA2 f
x y <*> z ==> liftA3 f x y z,---- etc., up to the pointer tagging
limit. But we do need to be careful. I don't-- *think* GHC will ever
inline the traversal into the go function (because that-- would
duplicate work), but if it did, and if different RULES fired for the--
two copies, everything would break horribly.---- Note: if it's
necessary for some reason, we *could* relax GADTs to--
ExistentialQuantification by changing the type of One to---- One ::
(b -> c) -> a -> Mag a b c---- where the function will always end up
being id. But we allocate a *lot*-- of One constructors, so this would
definitely be bad for performance.data Mag
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
where Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
:: t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
:: (x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
-> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
:: Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
-> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
#if MIN_VERSION_base(4,10,0) LiftA2
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
:: (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
-> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
#endif One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
:: a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
-> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instance
Functor (Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
where fmap = Map
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instance
Applicative (Mag
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)
where pure = Pure
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
(<*>) = Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
#if MIN_VERSION_base(4,10,0) liftA2 = LiftA2
https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
#endif
On Sun, Jan 3, 2021 at 11:09 AM David Feuer
You're not being very imaginative at all. Try out, oh, `StateT s Maybe`. Or play around with a nice fake functor like the magma used to implement `traverseBia` in `bifunctors`—pretty sure that won't work out.
On Sun, Jan 3, 2021, 11:00 AM Carter Schonwald
wrote: Hey everyone!
for context, I have some code where I was seeing how far coerce lets me go to avoid doing wrappers for certain codes,
i found i had to write the following (mapping an operation over to its newtyped sibling)
``` -- > :t QRA.wither --- forall a b f . Applicative f => (a -> f (Maybe b)) -> RAList a -> f (RAList b) --- wither :: forall a b f . (Applicative f, (forall c d . Coercible c d => Coercible (f c) (f d)) ) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
i'd much rather be able to write ``` wither :: forall a b f . (Applicative f) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
this seems like it'd be best done via something like changing the functor class definition to
``` class (forall c d . Coercible c d => Coercible (f c) (f d)) ) => Functor f where .. ```
is there any specific reason why this is not feasible? I cant think of a GADT where this wouldn't be totally safe to do (because unlike in foldable, f is in both the domain and co-domain), but maybe i'm not being imaginative enough?
look forward to learning what our obstacles are to making this happen for ghc 9.2 :)
-Carter
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

i guess the issue lies with the `One ` construtor? but the comment along
side this datatype already states that its treated as being "unsafe
coerced" already! so i dont quite see it as creating further issues?
On Sun, Jan 3, 2021 at 11:31 AM Carter Schonwald
Hey David, could you exposit what would go wrong? a concrete proof witness or explanation would help me a lot. other people might benefit too.
for the stateT s Maybe a, perhaps i'm still waking up this AM, so let me try newtype StateT s m a = StateT {runStateT :: s -> m (a, s)}
so this should expand to '(s -> Maybe (a,s)),' but the coerce would be on the 'a' here ... so i'm not seeing the issue?
the latter example seem to boil down to "a free appplicative/functor Gadt" with some extra bits, though i've not worked through to seeing the unsafety for the latter examples, the definitions are the following :
traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (Traversable t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica..., Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = inline (traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... traverse) -------- traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (forall f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Applicative f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) ------- smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> (forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... where go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bipure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bimap f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... <<*>> https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = biliftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) #endif go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... _) = p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... _ _ = impossibleError https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
---- and then the magma is -- This is used to reify a traversal for 'traverseBia'. It's a somewhat-- bogus 'Functor' and 'Applicative' closely related to 'Magma' from the-- @lens@ package. Valid traversals don't use (<$), (<*), or (*>), so-- we leave them out. We offer all the rest of the Functor and Applicative-- operations to improve performance: we generally want to keep the structure-- as small as possible. We might even consider using RULES to widen lifts-- when we can:---- liftA2 f x y <*> z ==> liftA3 f x y z,---- etc., up to the pointer tagging limit. But we do need to be careful. I don't-- *think* GHC will ever inline the traversal into the go function (because that-- would duplicate work), but if it did, and if different RULES fired for the-- two copies, everything would break horribly.---- Note: if it's necessary for some reason, we *could* relax GADTs to-- ExistentialQuantification by changing the type of One to---- One :: (b -> c) -> a -> Mag a b c---- where the function will always end up being id. But we allocate a *lot*-- of One constructors, so this would definitely be bad for performance.data Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... where Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #endif One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instance Functor (Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) where fmap = Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instance Applicative (Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) where pure = Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (<*>) = Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) liftA2 = LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #endif
On Sun, Jan 3, 2021 at 11:09 AM David Feuer
wrote: You're not being very imaginative at all. Try out, oh, `StateT s Maybe`. Or play around with a nice fake functor like the magma used to implement `traverseBia` in `bifunctors`—pretty sure that won't work out.
On Sun, Jan 3, 2021, 11:00 AM Carter Schonwald < carter.schonwald@gmail.com> wrote:
Hey everyone!
for context, I have some code where I was seeing how far coerce lets me go to avoid doing wrappers for certain codes,
i found i had to write the following (mapping an operation over to its newtyped sibling)
``` -- > :t QRA.wither --- forall a b f . Applicative f => (a -> f (Maybe b)) -> RAList a -> f (RAList b) --- wither :: forall a b f . (Applicative f, (forall c d . Coercible c d => Coercible (f c) (f d)) ) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
i'd much rather be able to write ``` wither :: forall a b f . (Applicative f) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
this seems like it'd be best done via something like changing the functor class definition to
``` class (forall c d . Coercible c d => Coercible (f c) (f d)) ) => Functor f where .. ```
is there any specific reason why this is not feasible? I cant think of a GADT where this wouldn't be totally safe to do (because unlike in foldable, f is in both the domain and co-domain), but maybe i'm not being imaginative enough?
look forward to learning what our obstacles are to making this happen for ghc 9.2 :)
-Carter
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Prelude Control.Monad.Trans.State> :i StateT type role StateT nominal representational nominal Note, `StateT` is nominal in last argument (a). Thus if (forall c d. Coercible ...) where a Functor superclass, Functor (and thus Monad) wouldn't be definable for StateT. That would be... unfortunate. Until there are "higher roles" Functor cannot be Coercible1. It would rule very simple code. (OTOH Mag can be repaired, https://oleg.fi/gists/posts/2019-07-31-fmap-coerce-coerce.html#functor-shoul...). - Oleg On 3.1.2021 18.31, Carter Schonwald wrote:
Hey David, could you exposit what would go wrong? a concrete proof witness or explanation would help me a lot. other people might benefit too.
for the stateT s Maybe a, perhaps i'm still waking up this AM, so let me try newtype StateT s m a = StateT {runStateT :: s -> m (a, s)}
so this should expand to '(s -> Maybe (a,s)),' but the coerce would be on the 'a' here ... so i'm not seeing the issue?
the latter example seem to boil down to "a free appplicative/functor Gadt" with some extra bits, though i've not worked through to seeing the unsafety for the latter examples, the definitions are the following : traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::(Traversablet https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...,Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)=>(a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...=inline(traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...traverse)-------- traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::forallp https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...=>(forallf https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....Applicativef https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...=>(a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...))->(a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...=smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) ------- smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::forallp https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...=>(a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->(forallx https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...))->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...=go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...wherego https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::forallx https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)=bipure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)=bimapf https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)=go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...<<*>> https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...#if MIN_VERSION_base(4,10,0) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)=biliftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)#endif go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica..._)=p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...__=impossibleError https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ---- and then the magma is -- This is used to reify a traversal for 'traverseBia'. It's a somewhat-- bogus 'Functor' and 'Applicative' closely related to 'Magma' from the-- @lens@ package. Valid traversals don't use (<$), (<*), or (*>), so-- we leave them out. We offer all the rest of the Functor and Applicative-- operations to improve performance: we generally want to keep the structure-- as small as possible. We might even consider using RULES to widen lifts-- when we can:---- liftA2 f x y <*> z ==> liftA3 f x y z,---- etc., up to the pointer tagging limit. But we do need to be careful. I don't-- *think* GHC will ever inline the traversal into the go function (because that-- would duplicate work), but if it did, and if different RULES fired for the-- two copies, everything would break horribly.---- Note: if it's necessary for some reason, we *could* relax GADTs to-- ExistentialQuantification by changing the type of One to---- One :: (b -> c) -> a -> Mag a b c---- where the function will always end up being id. But we allocate a *lot*-- of One constructors, so this would definitely be bad for performance.dataMag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...wherePure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::(x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...#if MIN_VERSION_base(4,10,0) LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...#endif One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instanceFunctor(Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)wherefmap=Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instanceApplicative(Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)wherepure=Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(<*>)=Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...#if MIN_VERSION_base(4,10,0) liftA2=LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...#endif
On Sun, Jan 3, 2021 at 11:09 AM David Feuer
mailto:david.feuer@gmail.com> wrote: You're not being very imaginative at all. Try out, oh, `StateT s Maybe`. Or play around with a nice fake functor like the magma used to implement `traverseBia` in `bifunctors`—pretty sure that won't work out.
On Sun, Jan 3, 2021, 11:00 AM Carter Schonwald
mailto:carter.schonwald@gmail.com> wrote: Hey everyone!
for context, I have some code where I was seeing how far coerce lets me go to avoid doing wrappers for certain codes,
i found i had to write the following (mapping an operation over to its newtyped sibling)
``` -- > :t QRA.wither --- forall a b f . Applicative f => (a -> f (Maybe b)) -> RAList a -> f (RAList b) --- wither :: forall a b f . (Applicative f, (forall c d . Coercible c d => Coercible (f c) (f d)) ) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
i'd much rather be able to write ``` wither :: forall a b f . (Applicative f) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
this seems like it'd be best done via something like changing the functor class definition to
``` class (forall c d . Coercible c d => Coercible (f c) (f d)) ) => Functor f where .. ```
is there any specific reason why this is not feasible? I cant think of a GADT where this wouldn't be totally safe to do (because unlike in foldable, f is in both the domain and co-domain), but maybe i'm not being imaginative enough?
look forward to learning what our obstacles are to making this happen for ghc 9.2 :)
-Carter
_______________________________________________ Libraries mailing list Libraries@haskell.org mailto:Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Mag uses the One it does for efficiency/compactness. Coercible constraints
aren't unpacked in data constructors, sadly. If you're looking for more
examples of slightly-invalid but useful Functors, the first place I'd check
(beyond the very-Mag-like things in lens that inspired Mag) is Roman
Cheplyaka's regex-applicative. I don't know if his lifts coercions or not
(haven't looked in a while) but it does some similarly illegitimate things
for good reasons.
On Sun, Jan 3, 2021, 12:03 PM Oleg Grenrus
Prelude Control.Monad.Trans.State> :i StateT type role StateT nominal representational nominal
Note, `StateT` is nominal in last argument (a). Thus if (forall c d. Coercible ...) where a Functor superclass, Functor (and thus Monad) wouldn't be definable for StateT. That would be... unfortunate.
Until there are "higher roles" Functor cannot be Coercible1. It would rule very simple code. (OTOH Mag can be repaired, https://oleg.fi/gists/posts/2019-07-31-fmap-coerce-coerce.html#functor-shoul... ).
- Oleg
On 3.1.2021 18.31, Carter Schonwald wrote:
Hey David, could you exposit what would go wrong? a concrete proof witness or explanation would help me a lot. other people might benefit too.
for the stateT s Maybe a, perhaps i'm still waking up this AM, so let me try newtype StateT s m a = StateT {runStateT :: s -> m (a, s)}
so this should expand to '(s -> Maybe (a,s)),' but the coerce would be on the 'a' here ... so i'm not seeing the issue?
the latter example seem to boil down to "a free appplicative/functor Gadt" with some extra bits, though i've not worked through to seeing the unsafety for the latter examples, the definitions are the following :
traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (Traversable t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica..., Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = inline (traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... traverse) --------traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (forall f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Applicative f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -------smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> (forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... where go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bipure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bimap f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... <<*>> https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = biliftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) #endif go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... _) = p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... _ _ = impossibleError https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
---- and then the magma is -- This is used to reify a traversal for 'traverseBia'. It's a somewhat-- bogus 'Functor' and 'Applicative' closely related to 'Magma' from the-- @lens@ package. Valid traversals don't use (<$), (<*), or (*>), so-- we leave them out. We offer all the rest of the Functor and Applicative-- operations to improve performance: we generally want to keep the structure-- as small as possible. We might even consider using RULES to widen lifts-- when we can:---- liftA2 f x y <*> z ==> liftA3 f x y z,---- etc., up to the pointer tagging limit. But we do need to be careful. I don't-- *think* GHC will ever inline the traversal into the go function (because that-- would duplicate work), but if it did, and if different RULES fired for the-- two copies, everything would break horribly.---- Note: if it's necessary for some reason, we *could* relax GADTs to-- ExistentialQuantification by changing the type of One to---- One :: (b -> c) -> a -> Mag a b c---- where the function will always end up being id. But we allocate a *lot*-- of One constructors, so this would definitely be bad for performance.data Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... where Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #endif One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instance Functor (Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) where fmap = Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instance Applicative (Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) where pure = Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (<*>) = Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) liftA2 = LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #endif
On Sun, Jan 3, 2021 at 11:09 AM David Feuer
wrote: You're not being very imaginative at all. Try out, oh, `StateT s Maybe`. Or play around with a nice fake functor like the magma used to implement `traverseBia` in `bifunctors`—pretty sure that won't work out.
On Sun, Jan 3, 2021, 11:00 AM Carter Schonwald < carter.schonwald@gmail.com> wrote:
Hey everyone!
for context, I have some code where I was seeing how far coerce lets me go to avoid doing wrappers for certain codes,
i found i had to write the following (mapping an operation over to its newtyped sibling)
``` -- > :t QRA.wither --- forall a b f . Applicative f => (a -> f (Maybe b)) -> RAList a -> f (RAList b) --- wither :: forall a b f . (Applicative f, (forall c d . Coercible c d => Coercible (f c) (f d)) ) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
i'd much rather be able to write ``` wither :: forall a b f . (Applicative f) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
this seems like it'd be best done via something like changing the functor class definition to
``` class (forall c d . Coercible c d => Coercible (f c) (f d)) ) => Functor f where .. ```
is there any specific reason why this is not feasible? I cant think of a GADT where this wouldn't be totally safe to do (because unlike in foldable, f is in both the domain and co-domain), but maybe i'm not being imaginative enough?
look forward to learning what our obstacles are to making this happen for ghc 9.2 :)
-Carter
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing listLibraries@haskell.orghttp://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

I think Mag, regex-applicative etc. examples are all reparable. The main culprit is however StateT and a like, as you pointed out. It's meaningless to discuss Mag if we cannot even write Functor m => Functor (StateT s m).
Coercible constraints aren't unpacked in data constructors
Aren't they zero-width at run time? That's IMO a bug if that is not true. - Oleg On 3.1.2021 19.08, David Feuer wrote:
Mag uses the One it does for efficiency/compactness. Coercible constraints aren't unpacked in data constructors, sadly. If you're looking for more examples of slightly-invalid but useful Functors, the first place I'd check (beyond the very-Mag-like things in lens that inspired Mag) is Roman Cheplyaka's regex-applicative. I don't know if his lifts coercions or not (haven't looked in a while) but it does some similarly illegitimate things for good reasons.
On Sun, Jan 3, 2021, 12:03 PM Oleg Grenrus
mailto:oleg.grenrus@iki.fi> wrote: Prelude Control.Monad.Trans.State> :i StateT type role StateT nominal representational nominal
Note, `StateT` is nominal in last argument (a). Thus if (forall c d. Coercible ...) where a Functor superclass, Functor (and thus Monad) wouldn't be definable for StateT. That would be... unfortunate.
Until there are "higher roles" Functor cannot be Coercible1. It would rule very simple code. (OTOH Mag can be repaired, https://oleg.fi/gists/posts/2019-07-31-fmap-coerce-coerce.html#functor-shoul...).
- Oleg
On 3.1.2021 18.31, Carter Schonwald wrote:
Hey David, could you exposit what would go wrong? a concrete proof witness or explanation would help me a lot. other people might benefit too.
for the stateT s Maybe a, perhaps i'm still waking up this AM, so let me try newtype StateT s m a = StateT {runStateT :: s -> m (a, s)}
so this should expand to '(s -> Maybe (a,s)),' but the coerce would be on the 'a' here ... so i'm not seeing the issue?
the latter example seem to boil down to "a free appplicative/functor Gadt" with some extra bits, though i've not worked through to seeing the unsafety for the latter examples, the definitions are the following : traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::(Traversablet https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...,Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)=>(a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...=inline(traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...traverse)-------- traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::forallp https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...=>(forallf https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....Applicativef https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...=>(a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...))->(a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...=smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) ------- smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::forallp https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...=>(a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->(forallx https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...))->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...=go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...wherego https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::forallx https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica....Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)=bipure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)=bimapf https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)=go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...<<*>> https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...#if MIN_VERSION_base(4,10,0) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)=biliftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)#endif go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)(One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica..._)=p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...__=impossibleError https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ---- and then the magma is -- This is used to reify a traversal for 'traverseBia'. It's a somewhat-- bogus 'Functor' and 'Applicative' closely related to 'Magma' from the-- @lens@ package. Valid traversals don't use (<$), (<*), or (*>), so-- we leave them out. We offer all the rest of the Functor and Applicative-- operations to improve performance: we generally want to keep the structure-- as small as possible. We might even consider using RULES to widen lifts-- when we can:---- liftA2 f x y <*> z ==> liftA3 f x y z,---- etc., up to the pointer tagging limit. But we do need to be careful. I don't-- *think* GHC will ever inline the traversal into the go function (because that-- would duplicate work), but if it did, and if different RULES fired for the-- two copies, everything would break horribly.---- Note: if it's necessary for some reason, we *could* relax GADTs to-- ExistentialQuantification by changing the type of One to---- One :: (b -> c) -> a -> Mag a b c---- where the function will always end up being id. But we allocate a *lot*-- of One constructors, so this would definitely be bad for performance.dataMag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...wherePure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::(x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...#if MIN_VERSION_base(4,10,0) LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::(t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...#endif One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...::a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...->Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instanceFunctor(Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)wherefmap=Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instanceApplicative(Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)wherepure=Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...(<*>)=Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...#if MIN_VERSION_base(4,10,0) liftA2=LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...#endif
On Sun, Jan 3, 2021 at 11:09 AM David Feuer
mailto:david.feuer@gmail.com> wrote: You're not being very imaginative at all. Try out, oh, `StateT s Maybe`. Or play around with a nice fake functor like the magma used to implement `traverseBia` in `bifunctors`—pretty sure that won't work out.
On Sun, Jan 3, 2021, 11:00 AM Carter Schonwald
mailto:carter.schonwald@gmail.com> wrote: Hey everyone!
for context, I have some code where I was seeing how far coerce lets me go to avoid doing wrappers for certain codes,
i found i had to write the following (mapping an operation over to its newtyped sibling)
``` -- > :t QRA.wither --- forall a b f . Applicative f => (a -> f (Maybe b)) -> RAList a -> f (RAList b) --- wither :: forall a b f . (Applicative f, (forall c d . Coercible c d => Coercible (f c) (f d)) ) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
i'd much rather be able to write ``` wither :: forall a b f . (Applicative f) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
this seems like it'd be best done via something like changing the functor class definition to
``` class (forall c d . Coercible c d => Coercible (f c) (f d)) ) => Functor f where .. ```
is there any specific reason why this is not feasible? I cant think of a GADT where this wouldn't be totally safe to do (because unlike in foldable, f is in both the domain and co-domain), but maybe i'm not being imaginative enough?
look forward to learning what our obstacles are to making this happen for ghc 9.2 :)
-Carter
_______________________________________________ Libraries mailing list Libraries@haskell.org mailto:Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org mailto:Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org mailto:Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Coercible is a lifted constraint wrapping the unlifted constraint, which I
remember is spelled either ~#r or some other permutation of those
characters. Last I looked, Coercible was *not* unpacked in data
constructors.
On Sun, Jan 3, 2021, 12:12 PM Oleg Grenrus
I think Mag, regex-applicative etc. examples are all reparable. The main culprit is however StateT and a like, as you pointed out. It's meaningless to discuss Mag if we cannot even write Functor m => Functor (StateT s m).
Coercible constraints aren't unpacked in data constructors
Aren't they zero-width at run time? That's IMO a bug if that is not true.
- Oleg On 3.1.2021 19.08, David Feuer wrote:
Mag uses the One it does for efficiency/compactness. Coercible constraints aren't unpacked in data constructors, sadly. If you're looking for more examples of slightly-invalid but useful Functors, the first place I'd check (beyond the very-Mag-like things in lens that inspired Mag) is Roman Cheplyaka's regex-applicative. I don't know if his lifts coercions or not (haven't looked in a while) but it does some similarly illegitimate things for good reasons.
On Sun, Jan 3, 2021, 12:03 PM Oleg Grenrus
wrote: Prelude Control.Monad.Trans.State> :i StateT type role StateT nominal representational nominal
Note, `StateT` is nominal in last argument (a). Thus if (forall c d. Coercible ...) where a Functor superclass, Functor (and thus Monad) wouldn't be definable for StateT. That would be... unfortunate.
Until there are "higher roles" Functor cannot be Coercible1. It would rule very simple code. (OTOH Mag can be repaired, https://oleg.fi/gists/posts/2019-07-31-fmap-coerce-coerce.html#functor-shoul... ).
- Oleg
On 3.1.2021 18.31, Carter Schonwald wrote:
Hey David, could you exposit what would go wrong? a concrete proof witness or explanation would help me a lot. other people might benefit too.
for the stateT s Maybe a, perhaps i'm still waking up this AM, so let me try newtype StateT s m a = StateT {runStateT :: s -> m (a, s)}
so this should expand to '(s -> Maybe (a,s)),' but the coerce would be on the 'a' here ... so i'm not seeing the issue?
the latter example seem to boil down to "a free appplicative/functor Gadt" with some extra bits, though i've not worked through to seeing the unsafety for the latter examples, the definitions are the following :
traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (Traversable t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica..., Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = inline (traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... traverse) --------traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (forall f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Applicative f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -------smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> (forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... where go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bipure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bimap f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... <<*>> https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = biliftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) #endif go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... _) = p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... _ _ = impossibleError https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
---- and then the magma is -- This is used to reify a traversal for 'traverseBia'. It's a somewhat-- bogus 'Functor' and 'Applicative' closely related to 'Magma' from the-- @lens@ package. Valid traversals don't use (<$), (<*), or (*>), so-- we leave them out. We offer all the rest of the Functor and Applicative-- operations to improve performance: we generally want to keep the structure-- as small as possible. We might even consider using RULES to widen lifts-- when we can:---- liftA2 f x y <*> z ==> liftA3 f x y z,---- etc., up to the pointer tagging limit. But we do need to be careful. I don't-- *think* GHC will ever inline the traversal into the go function (because that-- would duplicate work), but if it did, and if different RULES fired for the-- two copies, everything would break horribly.---- Note: if it's necessary for some reason, we *could* relax GADTs to-- ExistentialQuantification by changing the type of One to---- One :: (b -> c) -> a -> Mag a b c---- where the function will always end up being id. But we allocate a *lot*-- of One constructors, so this would definitely be bad for performance.data Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... where Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #endif One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instance Functor (Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) where fmap = Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instance Applicative (Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) where pure = Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (<*>) = Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) liftA2 = LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #endif
On Sun, Jan 3, 2021 at 11:09 AM David Feuer
wrote: You're not being very imaginative at all. Try out, oh, `StateT s Maybe`. Or play around with a nice fake functor like the magma used to implement `traverseBia` in `bifunctors`—pretty sure that won't work out.
On Sun, Jan 3, 2021, 11:00 AM Carter Schonwald < carter.schonwald@gmail.com> wrote:
Hey everyone!
for context, I have some code where I was seeing how far coerce lets me go to avoid doing wrappers for certain codes,
i found i had to write the following (mapping an operation over to its newtyped sibling)
``` -- > :t QRA.wither --- forall a b f . Applicative f => (a -> f (Maybe b)) -> RAList a -> f (RAList b) --- wither :: forall a b f . (Applicative f, (forall c d . Coercible c d => Coercible (f c) (f d)) ) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
i'd much rather be able to write ``` wither :: forall a b f . (Applicative f) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
this seems like it'd be best done via something like changing the functor class definition to
``` class (forall c d . Coercible c d => Coercible (f c) (f d)) ) => Functor f where .. ```
is there any specific reason why this is not feasible? I cant think of a GADT where this wouldn't be totally safe to do (because unlike in foldable, f is in both the domain and co-domain), but maybe i'm not being imaginative enough?
look forward to learning what our obstacles are to making this happen for ghc 9.2 :)
-Carter
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing listLibraries@haskell.orghttp://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Isn’t the issue here the first orderness of the current roles system in
ghc? In which case what technological issues should be fixed? That we
can’t do this because of limitations in the role system and I feel that
doing this sortah change would *force* this to be prioritized.
This limitation is a misfeature, how can we make this get addressed sooner
rather than later? Is this somewhere where Eg Haskell foundation or
something could help?
On Sun, Jan 3, 2021 at 12:15 PM Oleg Grenrus
I think Mag, regex-applicative etc. examples are all reparable. The main culprit is however StateT and a like, as you pointed out. It's meaningless to discuss Mag if we cannot even write Functor m => Functor (StateT s m).
Coercible constraints aren't unpacked in data constructors
Aren't they zero-width at run time? That's IMO a bug if that is not true.
- Oleg On 3.1.2021 19.08, David Feuer wrote:
Mag uses the One it does for efficiency/compactness. Coercible constraints aren't unpacked in data constructors, sadly. If you're looking for more examples of slightly-invalid but useful Functors, the first place I'd check (beyond the very-Mag-like things in lens that inspired Mag) is Roman Cheplyaka's regex-applicative. I don't know if his lifts coercions or not (haven't looked in a while) but it does some similarly illegitimate things for good reasons.
On Sun, Jan 3, 2021, 12:03 PM Oleg Grenrus
wrote: Prelude Control.Monad.Trans.State> :i StateT type role StateT nominal representational nominal
Note, `StateT` is nominal in last argument (a). Thus if (forall c d. Coercible ...) where a Functor superclass, Functor (and thus Monad) wouldn't be definable for StateT. That would be... unfortunate.
Until there are "higher roles" Functor cannot be Coercible1. It would rule very simple code. (OTOH Mag can be repaired, https://oleg.fi/gists/posts/2019-07-31-fmap-coerce-coerce.html#functor-shoul... ).
- Oleg
On 3.1.2021 18.31, Carter Schonwald wrote:
Hey David, could you exposit what would go wrong? a concrete proof witness or explanation would help me a lot. other people might benefit too.
for the stateT s Maybe a, perhaps i'm still waking up this AM, so let me try newtype StateT s m a = StateT {runStateT :: s -> m (a, s)}
so this should expand to '(s -> Maybe (a,s)),' but the coerce would be on the 'a' here ... so i'm not seeing the issue?
the latter example seem to boil down to "a free appplicative/functor Gadt" with some extra bits, though i've not worked through to seeing the unsafety for the latter examples, the definitions are the following :
traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (Traversable t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica..., Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = inline (traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... traverse) --------traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (forall f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Applicative f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -------smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> (forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... where go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bipure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bimap f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... <<*>> https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = biliftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) #endif go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... _) = p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... _ _ = impossibleError https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...
---- and then the magma is -- This is used to reify a traversal for 'traverseBia'. It's a somewhat-- bogus 'Functor' and 'Applicative' closely related to 'Magma' from the-- @lens@ package. Valid traversals don't use (<$), (<*), or (*>), so-- we leave them out. We offer all the rest of the Functor and Applicative-- operations to improve performance: we generally want to keep the structure-- as small as possible. We might even consider using RULES to widen lifts-- when we can:---- liftA2 f x y <*> z ==> liftA3 f x y z,---- etc., up to the pointer tagging limit. But we do need to be careful. I don't-- *think* GHC will ever inline the traversal into the go function (because that-- would duplicate work), but if it did, and if different RULES fired for the-- two copies, everything would break horribly.---- Note: if it's necessary for some reason, we *could* relax GADTs to-- ExistentialQuantification by changing the type of One to---- One :: (b -> c) -> a -> Mag a b c---- where the function will always end up being id. But we allocate a *lot*-- of One constructors, so this would definitely be bad for performance.data Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... where Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... v https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #endif One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instance Functor (Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) where fmap = Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...instance Applicative (Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) where pure = Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (<*>) = Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) liftA2 = LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #endif
On Sun, Jan 3, 2021 at 11:09 AM David Feuer
wrote: You're not being very imaginative at all. Try out, oh, `StateT s Maybe`. Or play around with a nice fake functor like the magma used to implement `traverseBia` in `bifunctors`—pretty sure that won't work out.
On Sun, Jan 3, 2021, 11:00 AM Carter Schonwald < carter.schonwald@gmail.com> wrote:
Hey everyone!
for context, I have some code where I was seeing how far coerce lets me go to avoid doing wrappers for certain codes,
i found i had to write the following (mapping an operation over to its newtyped sibling)
``` -- > :t QRA.wither --- forall a b f . Applicative f => (a -> f (Maybe b)) -> RAList a -> f (RAList b) --- wither :: forall a b f . (Applicative f, (forall c d . Coercible c d => Coercible (f c) (f d)) ) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
i'd much rather be able to write ``` wither :: forall a b f . (Applicative f) => (a -> f (Maybe b)) -> RAList a -> f (RAList b) wither = \f la -> coerce $ QRA.wither f $ coerce la ```
this seems like it'd be best done via something like changing the functor class definition to
``` class (forall c d . Coercible c d => Coercible (f c) (f d)) ) => Functor f where .. ```
is there any specific reason why this is not feasible? I cant think of a GADT where this wouldn't be totally safe to do (because unlike in foldable, f is in both the domain and co-domain), but maybe i'm not being imaginative enough?
look forward to learning what our obstacles are to making this happen for ghc 9.2 :)
-Carter
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing listLibraries@haskell.orghttp://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

So like, for stateT, isn’t the “fix” adding suport for higher order role
annotations to surface Haskell?
On Sun, Jan 3, 2021 at 1:02 PM Carter Schonwald
Isn’t the issue here the first orderness of the current roles system in ghc? In which case what technological issues should be fixed? That we can’t do this because of limitations in the role system and I feel that doing this sortah change would *force* this to be prioritized.
This limitation is a misfeature, how can we make this get addressed sooner rather than later? Is this somewhere where Eg Haskell foundation or something could help?
On Sun, Jan 3, 2021 at 12:15 PM Oleg Grenrus
wrote: I think Mag, regex-applicative etc. examples are all reparable. The main culprit is however StateT and a like, as you pointed out. It's meaningless to discuss Mag if we cannot even write Functor m => Functor (StateT s m).
Coercible constraints aren't unpacked in data constructors
Aren't they zero-width at run time? That's IMO a bug if that is not true.
- Oleg On 3.1.2021 19.08, David Feuer wrote:
Mag uses the One it does for efficiency/compactness. Coercible constraints aren't unpacked in data constructors, sadly. If you're looking for more examples of slightly-invalid but useful Functors, the first place I'd check (beyond the very-Mag-like things in lens that inspired Mag) is Roman Cheplyaka's regex-applicative. I don't know if his lifts coercions or not (haven't looked in a while) but it does some similarly illegitimate things for good reasons.
On Sun, Jan 3, 2021, 12:03 PM Oleg Grenrus
wrote: Prelude Control.Monad.Trans.State> :i StateT type role StateT nominal representational nominal
Note, `StateT` is nominal in last argument (a). Thus if (forall c d. Coercible ...) where a Functor superclass, Functor (and thus Monad) wouldn't be definable for StateT. That would be... unfortunate.
Until there are "higher roles" Functor cannot be Coercible1. It would rule very simple code. (OTOH Mag can be repaired, https://oleg.fi/gists/posts/2019-07-31-fmap-coerce-coerce.html#functor-shoul... ).
- Oleg
On 3.1.2021 18.31, Carter Schonwald wrote:
Hey David, could you exposit what would go wrong? a concrete proof witness or explanation would help me a lot. other people might benefit too.
for the stateT s Maybe a, perhaps i'm still waking up this AM, so let me try newtype StateT s m a = StateT {runStateT :: s -> m (a, s)}
so this should expand to '(s -> Maybe (a,s)),' but the coerce would be on the 'a' here ... so i'm not seeing the issue?
the latter example seem to boil down to "a free appplicative/functor Gadt" with some extra bits, though i've not worked through to seeing the unsafety for the latter examples, the definitions are the following :
traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (Traversable t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica..., Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = inline (traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... traverse) --------traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (forall f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Applicative f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -------smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> (forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... where go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bipure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bimap f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... <<*>> https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...

In particular; the original design for roles was to attach role info to the
kinds of types. See
https://www.seas.upenn.edu/~sweirich/papers/popl163af-weirich.pdf from 2011
Since ghc now has pervasive annotations on types internally via the
linearity work, enriching those with role information may be a tad more
tractable than it was at the time
On Sun, Jan 3, 2021 at 1:25 PM Carter Schonwald
So like, for stateT, isn’t the “fix” adding suport for higher order role annotations to surface Haskell?
On Sun, Jan 3, 2021 at 1:02 PM Carter Schonwald < carter.schonwald@gmail.com> wrote:
Isn’t the issue here the first orderness of the current roles system in ghc? In which case what technological issues should be fixed? That we can’t do this because of limitations in the role system and I feel that doing this sortah change would *force* this to be prioritized.
This limitation is a misfeature, how can we make this get addressed sooner rather than later? Is this somewhere where Eg Haskell foundation or something could help?
On Sun, Jan 3, 2021 at 12:15 PM Oleg Grenrus
wrote: I think Mag, regex-applicative etc. examples are all reparable. The main culprit is however StateT and a like, as you pointed out. It's meaningless to discuss Mag if we cannot even write Functor m => Functor (StateT s m).
Coercible constraints aren't unpacked in data constructors
Aren't they zero-width at run time? That's IMO a bug if that is not true.
- Oleg On 3.1.2021 19.08, David Feuer wrote:
Mag uses the One it does for efficiency/compactness. Coercible constraints aren't unpacked in data constructors, sadly. If you're looking for more examples of slightly-invalid but useful Functors, the first place I'd check (beyond the very-Mag-like things in lens that inspired Mag) is Roman Cheplyaka's regex-applicative. I don't know if his lifts coercions or not (haven't looked in a while) but it does some similarly illegitimate things for good reasons.
On Sun, Jan 3, 2021, 12:03 PM Oleg Grenrus
wrote: Prelude Control.Monad.Trans.State> :i StateT type role StateT nominal representational nominal
Note, `StateT` is nominal in last argument (a). Thus if (forall c d. Coercible ...) where a Functor superclass, Functor (and thus Monad) wouldn't be definable for StateT. That would be... unfortunate.
Until there are "higher roles" Functor cannot be Coercible1. It would rule very simple code. (OTOH Mag can be repaired, https://oleg.fi/gists/posts/2019-07-31-fmap-coerce-coerce.html#functor-shoul... ).
- Oleg
On 3.1.2021 18.31, Carter Schonwald wrote:
Hey David, could you exposit what would go wrong? a concrete proof witness or explanation would help me a lot. other people might benefit too.
for the stateT s Maybe a, perhaps i'm still waking up this AM, so let me try newtype StateT s m a = StateT {runStateT :: s -> m (a, s)}
so this should expand to '(s -> Maybe (a,s)),' but the coerce would be on the 'a' here ... so i'm not seeing the issue?
the latter example seem to boil down to "a free appplicative/functor Gadt" with some extra bits, though i've not worked through to seeing the unsafety for the latter examples, the definitions are the following :
traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (Traversable t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica..., Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = inline (traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... traverse) --------traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (forall f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Applicative f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -------smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> (forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... where go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bipure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bimap f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... <<*>> https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...

i think its worth emphasizing that ghc today uses a simplification of the
original 2011 paper... so revisiting it and seeing if the original design
is worthwhile may be easier than you'd expect!
for my own purposes, i'm doing the approach below / inline for now ;)
wither :: forall a b f . (Applicative f) =>
(a -> f (Maybe b)) -> RAList a -> f (RAList b)
wither = \f la -> coerceWith coerceThroughFunctor $ QRA.wither f $
coerce la
---
-- applicatives / functors can be coerced under, i have spoken
{-
for context, i otherwise need to do the following :
wither :: forall a b f . (Applicative f, (forall c d . Coercible c d =>
Coercible (f c) (f d)) ) =>
(a -> f (Maybe b)) -> RAList a -> f (RAList b)
wither = \f la -> coerce $ QRA.wither f $ coerce la
-}
{-#INLINE coerceThroughFunctor #-}
coerceThroughFunctor :: forall a b f. (Coercible a b, Functor f) =>
(Coercion (f a) (f b))
coerceThroughFunctor = (unsafeCoerce (Coercion :: Coercion a b )) ::
(Coercion (f a) (f b))
On Sun, Jan 3, 2021 at 2:40 PM Carter Schonwald
In particular; the original design for roles was to attach role info to the kinds of types. See https://www.seas.upenn.edu/~sweirich/papers/popl163af-weirich.pdf from 2011
Since ghc now has pervasive annotations on types internally via the linearity work, enriching those with role information may be a tad more tractable than it was at the time
On Sun, Jan 3, 2021 at 1:25 PM Carter Schonwald < carter.schonwald@gmail.com> wrote:
So like, for stateT, isn’t the “fix” adding suport for higher order role annotations to surface Haskell?
On Sun, Jan 3, 2021 at 1:02 PM Carter Schonwald < carter.schonwald@gmail.com> wrote:
Isn’t the issue here the first orderness of the current roles system in ghc? In which case what technological issues should be fixed? That we can’t do this because of limitations in the role system and I feel that doing this sortah change would *force* this to be prioritized.
This limitation is a misfeature, how can we make this get addressed sooner rather than later? Is this somewhere where Eg Haskell foundation or something could help?
On Sun, Jan 3, 2021 at 12:15 PM Oleg Grenrus
wrote: I think Mag, regex-applicative etc. examples are all reparable. The main culprit is however StateT and a like, as you pointed out. It's meaningless to discuss Mag if we cannot even write Functor m => Functor (StateT s m).
Coercible constraints aren't unpacked in data constructors
Aren't they zero-width at run time? That's IMO a bug if that is not true.
- Oleg On 3.1.2021 19.08, David Feuer wrote:
Mag uses the One it does for efficiency/compactness. Coercible constraints aren't unpacked in data constructors, sadly. If you're looking for more examples of slightly-invalid but useful Functors, the first place I'd check (beyond the very-Mag-like things in lens that inspired Mag) is Roman Cheplyaka's regex-applicative. I don't know if his lifts coercions or not (haven't looked in a while) but it does some similarly illegitimate things for good reasons.
On Sun, Jan 3, 2021, 12:03 PM Oleg Grenrus
wrote: Prelude Control.Monad.Trans.State> :i StateT type role StateT nominal representational nominal
Note, `StateT` is nominal in last argument (a). Thus if (forall c d. Coercible ...) where a Functor superclass, Functor (and thus Monad) wouldn't be definable for StateT. That would be... unfortunate.
Until there are "higher roles" Functor cannot be Coercible1. It would rule very simple code. (OTOH Mag can be repaired, https://oleg.fi/gists/posts/2019-07-31-fmap-coerce-coerce.html#functor-shoul... ).
- Oleg
On 3.1.2021 18.31, Carter Schonwald wrote:
Hey David, could you exposit what would go wrong? a concrete proof witness or explanation would help me a lot. other people might benefit too.
for the stateT s Maybe a, perhaps i'm still waking up this AM, so let me try newtype StateT s m a = StateT {runStateT :: s -> m (a, s)}
so this should expand to '(s -> Maybe (a,s)),' but the coerce would be on the 'a' here ... so i'm not seeing the issue?
the latter example seem to boil down to "a free appplicative/functor Gadt" with some extra bits, though i've not worked through to seeing the unsafety for the latter examples, the definitions are the following :
traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: (Traversable t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica..., Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBia https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = inline (traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... traverse) --------traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (forall f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Applicative f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)traverseBiaWith https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (trav https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... One https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... s https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -------smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... => (a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) -> (forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)) -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...)smash https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... m https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... where go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... :: forall x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica.... Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... b https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> Mag https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... a https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... c https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... -> p https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Pure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bipure https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... t https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... u https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Map https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = bimap f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... x https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... y https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (Ap https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... fs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... gs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... <<*>> https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... #if MIN_VERSION_base(4,10,0) go https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... f https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... xs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ys https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) (LiftA2 https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... g https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... zs https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica... ws https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...) = https://hackage.haskell.org/package/bifunctors-5.5.9/docs/src/Data.Biapplica...

On Jan 3, 2021, at 1:02 PM, Carter Schonwald
wrote: This limitation is a misfeature, how can we make this get addressed sooner rather than later? Is this somewhere where Eg Haskell foundation or something could help?
Lifting the limitation would be nice, but it's a lot of work. First, we need an updated theory for Core, with a type safety proof. This proof is essential: it's what our safety as a language depends on. Then, we'd need to implement it. I'm more worried about the former than the latter.
i think its worth emphasizing that ghc today uses a simplification of the original 2011 paper...
Yes, that was originally true, but the current formulation goes beyond the 2011 paper in some respects. See section 7.1 of https://richarde.dev/papers/2016/coercible-jfp/coercible-jfp.pdf https://richarde.dev/papers/2016/coercible-jfp/coercible-jfp.pdf. Roman writes:
I think it's important we keep the definitions of Functor and other fundamental classes understandable by newcomers, and this change would make the definition look scary for a marginal benefit.
This is tough. I've considered a Functor definition like the one Carter proposes before. I would personally rather come up with the best definition first, then figure out how to make it palatable to newcomers second. For example, we could write (today)
type Representational f = forall a b. Coercible a b => Coercible (f a) (f b)
and then the class constraint looks more pleasant. Or we could create ways of suppressing confusing information. Or there are other solutions. Depending on the benefit of the change (here or elsewhere), I would advocate holding off on making the change until we can support it without disrupting the newcomer story. But I wouldn't want to abandon the idea of an improvement a priori just because of a disruption to the newcomer experience. Richard

Thx for the link. I’ll take a look at your suggested reading.
What are ways I could help progress whatever’s needed to get to a nice
ending?
On Mon, Jan 4, 2021 at 9:00 AM Richard Eisenberg
On Jan 3, 2021, at 1:02 PM, Carter Schonwald
wrote: This limitation is a misfeature, how can we make this get addressed sooner rather than later? Is this somewhere where Eg Haskell foundation or something could help?
Lifting the limitation would be nice, but it's a lot of work. First, we need an updated theory for Core, with a type safety proof. This proof is essential: it's what our safety as a language depends on. Then, we'd need to implement it. I'm more worried about the former than the latter.
i think its worth emphasizing that ghc today uses a simplification of the original 2011 paper...
Yes, that was originally true, but the current formulation goes beyond the 2011 paper in some respects. See section 7.1 of https://richarde.dev/papers/2016/coercible-jfp/coercible-jfp.pdf.
Roman writes:
I think it's important we keep the definitions of Functor and other fundamental classes understandable by newcomers, and this change would make the definition look scary for a marginal benefit.
This is tough. I've considered a Functor definition like the one Carter proposes before. I would personally rather come up with the best definition first, then figure out how to make it palatable to newcomers second. For example, we could write (today)
type Representational f = forall a b. Coercible a b => Coercible (f a) (f b)
and then the class constraint looks more pleasant. Or we could create ways of suppressing confusing information. Or there are other solutions. Depending on the benefit of the change (here or elsewhere), I would advocate holding off on making the change until we can support it without disrupting the newcomer story. But I wouldn't want to abandon the idea of an improvement a priori just because of a disruption to the newcomer experience.
Richard

I talked to Carter a bit on IRC for my progress on that front, but I thought maybe this would be a good time to mention this more widely - The constraint side is iffy. Local constraints and constraint kinds make it hard to have some sort of codata guardedness / cotermination checking argument for higher order coercion "instances" that doesn't also need to apply to the constraint system at large, which makes it quite laborious to increase expressive power without trade-offs like no local quantified constraints. (Yay mission creep.) - The core side looks good. Cale and I pretty confident in the "coercions as fixed points of products", with {0, 1, multiplication, and exponentiation, limits} passing my cardinality sniff test that coercions still have no computational content and thus can be erased. - Additionally, I am less but decently confident (though I haven't talked to Cale about this) that the existing role admissibility solver can be repurposed to produce those (to-be-erased) terms rather than just merely deciding the admissibility of (opaque) axiomatic coercions. This change would have no expressive power implications one way or the other, but complete the "theory refactor" so that the "sans-nth" version could be said to work end to end. So tl;dr I /can't/ actually do anything to help Carter's problem at the moment, but I think I can get David's https://github.com/ghc-proposals/ghc-proposals/pull/276 over the finish line, with the side benefit of loosening things up and getting us closer so the higher-order roles problem seems less out of reach. I have revised my "progress report" wildly since I started thinking about these things, but with the latest ratchet back, I think I finally have a stable prediction. Cheers, John On 1/4/21 9:12 AM, Carter Schonwald wrote:
Thx for the link. I’ll take a look at your suggested reading.
What are ways I could help progress whatever’s needed to get to a nice ending?
On Mon, Jan 4, 2021 at 9:00 AM Richard Eisenberg
mailto:rae@richarde.dev> wrote: On Jan 3, 2021, at 1:02 PM, Carter Schonwald
mailto:carter.schonwald@gmail.com> wrote: This limitation is a misfeature, how can we make this get addressed sooner rather than later? Is this somewhere where Eg Haskell foundation or something could help?
Lifting the limitation would be nice, but it's a lot of work. First, we need an updated theory for Core, with a type safety proof. This proof is essential: it's what our safety as a language depends on. Then, we'd need to implement it. I'm more worried about the former than the latter.
> i think its worth emphasizing that ghc today uses a simplification of the original 2011 paper...
Yes, that was originally true, but the current formulation goes beyond the 2011 paper in some respects. See section 7.1 of https://richarde.dev/papers/2016/coercible-jfp/coercible-jfp.pdf https://richarde.dev/papers/2016/coercible-jfp/coercible-jfp.pdf.
Roman writes:
> I think it's important we keep the definitions of Functor and other fundamental classes understandable by newcomers, and this change would make the definition look scary for a marginal benefit.
This is tough. I've considered a Functor definition like the one Carter proposes before. I would personally rather come up with the best definition first, then figure out how to make it palatable to newcomers second. For example, we could write (today)
> type Representational f = forall a b. Coercible a b => Coercible (f a) (f b)
and then the class constraint looks more pleasant. Or we could create ways of suppressing confusing information. Or there are other solutions. Depending on the benefit of the change (here or elsewhere), I would advocate holding off on making the change until we can support it without disrupting the newcomer story. But I wouldn't want to abandon the idea of an improvement a priori just because of a disruption to the newcomer experience.
Richard
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Currently:
head ~(a :| _) = a
tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a
tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a
tail !(_ :| as) = as
?
--Keith
Sent from my phone with K-9 Mail.
On January 4, 2021 2:40:58 PM UTC, John Ericson
I talked to Carter a bit on IRC for my progress on that front, but I thought maybe this would be a good time to mention this more widely
- The constraint side is iffy. Local constraints and constraint kinds make it hard to have some sort of codata guardedness / cotermination checking argument for higher order coercion "instances" that doesn't also need to apply to the constraint system at large, which makes it quite laborious to increase expressive power without trade-offs like no local quantified constraints. (Yay mission creep.)
- The core side looks good. Cale and I pretty confident in the "coercions as fixed points of products", with {0, 1, multiplication, and exponentiation, limits} passing my cardinality sniff test that coercions still have no computational content and thus can be erased.
- Additionally, I am less but decently confident (though I haven't talked to Cale about this) that the existing role admissibility solver can be repurposed to produce those (to-be-erased) terms rather than just merely deciding the admissibility of (opaque) axiomatic coercions. This change would have no expressive power implications one way or the other, but complete the "theory refactor" so that the "sans-nth" version could be said to work end to end.
So tl;dr I /can't/ actually do anything to help Carter's problem at the moment, but I think I can get David's https://github.com/ghc-proposals/ghc-proposals/pull/276 over the finish line, with the side benefit of loosening things up and getting us closer so the higher-order roles problem seems less out of reach.
I have revised my "progress report" wildly since I started thinking about these things, but with the latest ratchet back, I think I finally have a stable prediction.
Cheers,
John
On 1/4/21 9:12 AM, Carter Schonwald wrote:
Thx for the link. I’ll take a look at your suggested reading.
What are ways I could help progress whatever’s needed to get to a nice ending?
On Mon, Jan 4, 2021 at 9:00 AM Richard Eisenberg
mailto:rae@richarde.dev> wrote: On Jan 3, 2021, at 1:02 PM, Carter Schonwald
mailto:carter.schonwald@gmail.com> wrote: This limitation is a misfeature, how can we make this get addressed sooner rather than later? Is this somewhere where Eg Haskell foundation or something could help?
Lifting the limitation would be nice, but it's a lot of work. First, we need an updated theory for Core, with a type safety proof. This proof is essential: it's what our safety as a language depends on. Then, we'd need to implement it. I'm more worried about the former than the latter.
> i think its worth emphasizing that ghc today uses a simplification of the original 2011 paper...
Yes, that was originally true, but the current formulation goes beyond the 2011 paper in some respects. See section 7.1 of https://richarde.dev/papers/2016/coercible-jfp/coercible-jfp.pdf https://richarde.dev/papers/2016/coercible-jfp/coercible-jfp.pdf.
Roman writes:
> I think it's important we keep the definitions of Functor and other fundamental classes understandable by newcomers, and this change would make the definition look scary for a marginal benefit.
This is tough. I've considered a Functor definition like the one Carter proposes before. I would personally rather come up with the best definition first, then figure out how to make it palatable to newcomers second. For example, we could write (today)
> type Representational f = forall a b. Coercible a b => Coercible (f a) (f b)
and then the class constraint looks more pleasant. Or we could create ways of suppressing confusing information. Or there are other solutions. Depending on the benefit of the change (here or elsewhere), I would advocate holding off on making the change until we can support it without disrupting the newcomer story. But I wouldn't want to abandon the idea of an improvement a priori just because of a disruption to the newcomer experience.
Richard
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

The first one. Neither twiddles nor bangs are useful or add clarity.
On Fri, Jan 8, 2021, 11:53 AM Keith
Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
? --Keith Sent from my phone with K-9 Mail.
On January 4, 2021 2:40:58 PM UTC, John Ericson
wrote: I talked to Carter a bit on IRC for my progress on that front, but I thought maybe this would be a good time to mention this more widely
- The constraint side is iffy. Local constraints and constraint kinds make it hard to have some sort of codata guardedness / cotermination checking argument for higher order coercion "instances" that doesn't also need to apply to the constraint system at large, which makes it quite laborious to increase expressive power without trade-offs like no local quantified constraints. (Yay mission creep.)
- The core side looks good. Cale and I pretty confident in the "coercions as fixed points of products", with {0, 1, multiplication, and exponentiation, limits} passing my cardinality sniff test that coercions still have no computational content and thus can be erased.
- Additionally, I am less but decently confident (though I haven't talked to Cale about this) that the existing role admissibility solver can be repurposed to produce those (to-be-erased) terms rather than just merely deciding the admissibility of (opaque) axiomatic coercions. This change would have no expressive power implications one way or the other, but complete the "theory refactor" so that the "sans-nth" version could be said to work end to end.
So tl;dr I *can't* actually do anything to help Carter's problem at the moment, but I think I can get David's https://github.com/ghc-proposals/ghc-proposals/pull/276 over the finish line, with the side benefit of loosening things up and getting us closer so the higher-order roles problem seems less out of reach.
I have revised my "progress report" wildly since I started thinking about these things, but with the latest ratchet back, I think I finally have a stable prediction.
Cheers,
John On 1/4/21 9:12 AM, Carter Schonwald wrote:
Thx for the link. I’ll take a look at your suggested reading.
What are ways I could help progress whatever’s needed to get to a nice ending?
On Mon, Jan 4, 2021 at 9:00 AM Richard Eisenberg
wrote: On Jan 3, 2021, at 1:02 PM, Carter Schonwald
wrote: This limitation is a misfeature, how can we make this get addressed sooner rather than later? Is this somewhere where Eg Haskell foundation or something could help?
Lifting the limitation would be nice, but it's a lot of work. First, we need an updated theory for Core, with a type safety proof. This proof is essential: it's what our safety as a language depends on. Then, we'd need to implement it. I'm more worried about the former than the latter.
i think its worth emphasizing that ghc today uses a simplification of the original 2011 paper...
Yes, that was originally true, but the current formulation goes beyond the 2011 paper in some respects. See section 7.1 of https://richarde.dev/papers/2016/coercible-jfp/coercible-jfp.pdf.
Roman writes:
I think it's important we keep the definitions of Functor and other fundamental classes understandable by newcomers, and this change would make the definition look scary for a marginal benefit.
This is tough. I've considered a Functor definition like the one Carter proposes before. I would personally rather come up with the best definition first, then figure out how to make it palatable to newcomers second. For example, we could write (today)
type Representational f = forall a b. Coercible a b => Coercible (f a) (f b)
and then the class constraint looks more pleasant. Or we could create ways of suppressing confusing information. Or there are other solutions. Depending on the benefit of the change (here or elsewhere), I would advocate holding off on making the change until we can support it without disrupting the newcomer story. But I wouldn't want to abandon the idea of an improvement a priori just because of a disruption to the newcomer experience.
Richard
_______________________________________________ Libraries mailing listLibraries@haskell.orghttp://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________
Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

On Fri, Jan 08, 2021 at 04:52:33PM +0000, Keith wrote:
Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
I would support that. It would be nice if GHC warned about misleading lazy patterns.
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
Why do you say "more clearly"? Every pattern match is strict, more or less by definition[1] so I don't see how a bang pattern adds anything. If this is more clear then shouldn't we make the case to do it to *every* pattern match everywhere? Tom [1] with the exception of weird edge cases around pattern synonyms: pattern Pat :: p pattern Pat <- _ pattern LPat :: a -> Maybe a pattern LPat a <- ~(Just a) f :: a -> Int f Pat = 1 f _ = 2 f' :: a -> Int f' !Pat = 1 f' _ = 2 g :: Maybe a -> Int g (LPat _) = 1 g _ = 2 g' :: Maybe a -> Int g' (LPat _) = 1 g' _ = 2

On Fri, 8 Jan 2021, Keith wrote:
Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
?
The last one would trigger the "redundant bang pattern" warning that is going to be implemented/released: https://gitlab.haskell.org/ghc/ghc/issues/17340

Thanks, will do.
On January 8, 2021 5:07:25 PM UTC, David Feuer
The first one. Neither twiddles nor bangs are useful or add clarity.
On Fri, Jan 8, 2021, 11:53 AM Keith
wrote: Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
? --Keith Sent from my phone with K-9 Mail.
Good to know! Wasn't aware that that was in the works.
And sorry for accidentally threading this onto something unrelated.
-- Keith
Sent from my phone with K-9 Mail.
On January 8, 2021 5:13:31 PM UTC, Henning Thielemann
On Fri, 8 Jan 2021, Keith wrote:
Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
?
The last one would trigger the "redundant bang pattern" warning that is going to be implemented/released: https://gitlab.haskell.org/ghc/ghc/issues/17340

There are a couple other ones that I'm less sure about.
cons:
a <| ~(b :| bs) = a :| b : bs
Unsugared this is
a <| bs = a :|
(case bs of b :| _ -> b ) :
case bs of _ :| bs -> bs
Would this make more sense?
a <| bs = a :| case bs of b :| bs' -> b : bs'
Then
cons x undefined = x :| undefined
not
x :| undefined : undefined
groupBy1 matches strictly, could be lazy. (Is this a performance issue or an oversight?)
—
Sent from my phone with K-9 Mail.
On January 8, 2021 6:36:58 PM UTC, Keith
Thanks, will do.
On January 8, 2021 5:07:25 PM UTC, David Feuer
wrote: The first one. Neither twiddles nor bangs are useful or add clarity.
On Fri, Jan 8, 2021, 11:53 AM Keith
wrote: Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
? --Keith Sent from my phone with K-9 Mail.
Good to know! Wasn't aware that that was in the works.
And sorry for accidentally threading this onto something unrelated.
-- Keith Sent from my phone with K-9 Mail.
On January 8, 2021 5:13:31 PM UTC, Henning Thielemann
wrote: On Fri, 8 Jan 2021, Keith wrote:
Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
?
The last one would trigger the "redundant bang pattern" warning that is going to be implemented/released: https://gitlab.haskell.org/ghc/ghc/issues/17340

I agree that your implementation of (<|) is more reasonable. I'll take
a look at groupBy1 in a bit.
On Fri, Jan 8, 2021 at 2:27 PM Keith
There are a couple other ones that I'm less sure about.
cons: a <| ~(b :| bs) = a :| b : bs
Unsugared this is a <| bs = a :| (case bs of b :| _ -> b ) : case bs of _ :| bs -> bs
Would this make more sense? a <| bs = a :| case bs of b :| bs' -> b : bs'
Then cons x undefined = x :| undefined not x :| undefined : undefined
groupBy1 matches strictly, could be lazy. (Is this a performance issue or an oversight?) — Sent from my phone with K-9 Mail.
On January 8, 2021 6:36:58 PM UTC, Keith
wrote: Thanks, will do.
On January 8, 2021 5:07:25 PM UTC, David Feuer
wrote: The first one. Neither twiddles nor bangs are useful or add clarity.
On Fri, Jan 8, 2021, 11:53 AM Keith
wrote: Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
? --Keith Sent from my phone with K-9 Mail.
Good to know! Wasn't aware that that was in the works.
And sorry for accidentally threading this onto something unrelated.
-- Keith Sent from my phone with K-9 Mail.
On January 8, 2021 5:13:31 PM UTC, Henning Thielemann
wrote: On Fri, 8 Jan 2021, Keith wrote:
Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
?
The last one would trigger the "redundant bang pattern" warning that is going to be implemented/released: https://gitlab.haskell.org/ghc/ghc/issues/17340
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Well, more reasonable from a performance standpoint anyway.
Semantically, it makes sense as it is.
On Fri, Jan 8, 2021 at 2:33 PM David Feuer
I agree that your implementation of (<|) is more reasonable. I'll take a look at groupBy1 in a bit.
On Fri, Jan 8, 2021 at 2:27 PM Keith
wrote: There are a couple other ones that I'm less sure about.
cons: a <| ~(b :| bs) = a :| b : bs
Unsugared this is a <| bs = a :| (case bs of b :| _ -> b ) : case bs of _ :| bs -> bs
Would this make more sense? a <| bs = a :| case bs of b :| bs' -> b : bs'
Then cons x undefined = x :| undefined not x :| undefined : undefined
groupBy1 matches strictly, could be lazy. (Is this a performance issue or an oversight?) — Sent from my phone with K-9 Mail.
On January 8, 2021 6:36:58 PM UTC, Keith
wrote: Thanks, will do.
On January 8, 2021 5:07:25 PM UTC, David Feuer
wrote: The first one. Neither twiddles nor bangs are useful or add clarity.
On Fri, Jan 8, 2021, 11:53 AM Keith
wrote: Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
? --Keith Sent from my phone with K-9 Mail.
Good to know! Wasn't aware that that was in the works.
And sorry for accidentally threading this onto something unrelated.
-- Keith Sent from my phone with K-9 Mail.
On January 8, 2021 5:13:31 PM UTC, Henning Thielemann
wrote: On Fri, 8 Jan 2021, Keith wrote:
Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
?
The last one would trigger the "redundant bang pattern" warning that is going to be implemented/released: https://gitlab.haskell.org/ghc/ghc/issues/17340
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Yeah, the more I think about it, the more I like your stricter (<|). I
don't see any really useful laziness to add to groupBy1. What were you
thinking of?
On Fri, Jan 8, 2021 at 2:27 PM Keith
There are a couple other ones that I'm less sure about.
cons: a <| ~(b :| bs) = a :| b : bs
Unsugared this is a <| bs = a :| (case bs of b :| _ -> b ) : case bs of _ :| bs -> bs
Would this make more sense? a <| bs = a :| case bs of b :| bs' -> b : bs'
Then cons x undefined = x :| undefined not x :| undefined : undefined
groupBy1 matches strictly, could be lazy. (Is this a performance issue or an oversight?) — Sent from my phone with K-9 Mail.
On January 8, 2021 6:36:58 PM UTC, Keith
wrote: Thanks, will do.
On January 8, 2021 5:07:25 PM UTC, David Feuer
wrote: The first one. Neither twiddles nor bangs are useful or add clarity.
On Fri, Jan 8, 2021, 11:53 AM Keith
wrote: Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
? --Keith Sent from my phone with K-9 Mail.
Good to know! Wasn't aware that that was in the works.
And sorry for accidentally threading this onto something unrelated.
-- Keith Sent from my phone with K-9 Mail.
On January 8, 2021 5:13:31 PM UTC, Henning Thielemann
wrote: On Fri, 8 Jan 2021, Keith wrote:
Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
?
The last one would trigger the "redundant bang pattern" warning that is going to be implemented/released: https://gitlab.haskell.org/ghc/ghc/issues/17340
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Note also -- | @since 4.9.0.0 instance Foldable NonEmpty where foldr f z ~(a :| as) = f a (List.foldr f z as) foldl f z (a :| as) = List.foldl f (f z a) as foldl1 f (a :| as) = List.foldl f a as -- GHC isn't clever enough to transform the default definition -- into anything like this, so we'd end up shuffling a bunch of -- Maybes around. foldr1 f (p :| ps) = foldr go id ps p where go x r prev = f prev (r x) -- We used to say -- -- length (_ :| as) = 1 + length as -- -- but the default definition is better, counting from 1. -- -- The default definition also works great for null and foldl'. -- As usual for cons lists, foldr' is basically hopeless. foldMap f ~(a :| as) = f a `mappend` foldMap f as fold ~(m :| ms) = m `mappend` fold ms toList ~(a :| as) = a : as Plenty of irrefutable patterns. On 8.1.2021 21.41, David Feuer wrote:
Yeah, the more I think about it, the more I like your stricter (<|). I don't see any really useful laziness to add to groupBy1. What were you thinking of?
On Fri, Jan 8, 2021 at 2:27 PM Keith
wrote: There are a couple other ones that I'm less sure about.
cons: a <| ~(b :| bs) = a :| b : bs
Unsugared this is a <| bs = a :| (case bs of b :| _ -> b ) : case bs of _ :| bs -> bs
Would this make more sense? a <| bs = a :| case bs of b :| bs' -> b : bs'
Then cons x undefined = x :| undefined not x :| undefined : undefined
groupBy1 matches strictly, could be lazy. (Is this a performance issue or an oversight?) — Sent from my phone with K-9 Mail.
On January 8, 2021 6:36:58 PM UTC, Keith
wrote: Thanks, will do.
On January 8, 2021 5:07:25 PM UTC, David Feuer
wrote: The first one. Neither twiddles nor bangs are useful or add clarity.
On Fri, Jan 8, 2021, 11:53 AM Keith
wrote: Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
? --Keith Sent from my phone with K-9 Mail.
Good to know! Wasn't aware that that was in the works.
And sorry for accidentally threading this onto something unrelated.
-- Keith Sent from my phone with K-9 Mail.
On January 8, 2021 5:13:31 PM UTC, Henning Thielemann
wrote: On Fri, 8 Jan 2021, Keith wrote:
Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
?
The last one would trigger the "redundant bang pattern" warning that is going to be implemented/released: https://gitlab.haskell.org/ghc/ghc/issues/17340
Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

On Fri, Jan 08, 2021 at 09:44:31PM +0200, Oleg Grenrus wrote:
Note also
-- | @since 4.9.0.0 instance Foldable NonEmpty where foldr f z ~(a :| as) = f a (List.foldr f z as) foldl f z (a :| as) = List.foldl f (f z a) as foldl1 f (a :| as) = List.foldl f a as
-- GHC isn't clever enough to transform the default definition -- into anything like this, so we'd end up shuffling a bunch of -- Maybes around. foldr1 f (p :| ps) = foldr go id ps p where go x r prev = f prev (r x)
-- We used to say -- -- length (_ :| as) = 1 + length as -- -- but the default definition is better, counting from 1. -- -- The default definition also works great for null and foldl'. -- As usual for cons lists, foldr' is basically hopeless.
foldMap f ~(a :| as) = f a `mappend` foldMap f as fold ~(m :| ms) = m `mappend` fold ms toList ~(a :| as) = a : as
Plenty of irrefutable patterns.
Do any of these make "mfix" more usable for NonEmpty? Or are they just superfluous? With just one constructor, is there any downside to an irrefutable pattern? -- Viktor.

I'd expect that anyone who uses mfix with NonEmpty as result would use explicit (and irrefutable) pattern matching. But yes, changing these might make some code break. I'm not confident at all it won't make some code less efficient too, by forcing the structure of NonEmpty too early. So I would like that this thread is only about changing `head` and `tail` and not let scope creep. OR we hold this and let Keith come up with more complete NonEmpty implementation change. - Oleg On 8.1.2021 21.50, Viktor Dukhovni wrote:
On Fri, Jan 08, 2021 at 09:44:31PM +0200, Oleg Grenrus wrote:
Note also
-- | @since 4.9.0.0 instance Foldable NonEmpty where foldr f z ~(a :| as) = f a (List.foldr f z as) foldl f z (a :| as) = List.foldl f (f z a) as foldl1 f (a :| as) = List.foldl f a as
-- GHC isn't clever enough to transform the default definition -- into anything like this, so we'd end up shuffling a bunch of -- Maybes around. foldr1 f (p :| ps) = foldr go id ps p where go x r prev = f prev (r x)
-- We used to say -- -- length (_ :| as) = 1 + length as -- -- but the default definition is better, counting from 1. -- -- The default definition also works great for null and foldl'. -- As usual for cons lists, foldr' is basically hopeless.
foldMap f ~(a :| as) = f a `mappend` foldMap f as fold ~(m :| ms) = m `mappend` fold ms toList ~(a :| as) = a : as
Plenty of irrefutable patterns. Do any of these make "mfix" more usable for NonEmpty? Or are they just superfluous? With just one constructor, is there any downside to an irrefutable pattern?

I think removing the annotations that don't change anything can be done in
a GHC MR without discussion on this list. I think the discussion on things
that change strictness can and should continue here.
On Fri, Jan 8, 2021, 2:59 PM Oleg Grenrus
I'd expect that anyone who uses mfix with NonEmpty as result would use explicit (and irrefutable) pattern matching.
But yes, changing these might make some code break. I'm not confident at all it won't make some code less efficient too, by forcing the structure of NonEmpty too early.
So I would like that this thread is only about changing `head` and `tail` and not let scope creep. OR we hold this and let Keith come up with more complete NonEmpty implementation change.
- Oleg
On 8.1.2021 21.50, Viktor Dukhovni wrote:
On Fri, Jan 08, 2021 at 09:44:31PM +0200, Oleg Grenrus wrote:
Note also
-- | @since 4.9.0.0 instance Foldable NonEmpty where foldr f z ~(a :| as) = f a (List.foldr f z as) foldl f z (a :| as) = List.foldl f (f z a) as foldl1 f (a :| as) = List.foldl f a as
-- GHC isn't clever enough to transform the default definition -- into anything like this, so we'd end up shuffling a bunch of -- Maybes around. foldr1 f (p :| ps) = foldr go id ps p where go x r prev = f prev (r x)
-- We used to say -- -- length (_ :| as) = 1 + length as -- -- but the default definition is better, counting from 1. -- -- The default definition also works great for null and foldl'. -- As usual for cons lists, foldr' is basically hopeless.
foldMap f ~(a :| as) = f a `mappend` foldMap f as fold ~(m :| ms) = m `mappend` fold ms toList ~(a :| as) = a : as
Plenty of irrefutable patterns. Do any of these make "mfix" more usable for NonEmpty? Or are they just superfluous? With just one constructor, is there any downside to an irrefutable pattern?
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Agreed. But to make discussion more productive I suggest that someone (you, Keith?) goes through the list and makes concrete suggestion for each point. It's not that long. ghc/libraries % git grep ':|' | grep '~' base/Control/Monad/Fix.hs: ~(x :| _) -> x :| mfix (neTail . f) base/Control/Monad/Fix.hs: neHead ~(a :| _) = a base/Control/Monad/Fix.hs: neTail ~(_ :| as) = as base/Data/Foldable.hs: foldr f z ~(a :| as) = f a (List.foldr f z as) base/Data/Foldable.hs: foldMap f ~(a :| as) = f a `mappend` foldMap f as base/Data/Foldable.hs: fold ~(m :| ms) = m `mappend` fold ms base/Data/Foldable.hs: toList ~(a :| as) = a : as base/Data/List/NonEmpty.hs:uncons ~(a :| as) = (a, nonEmpty as) base/Data/List/NonEmpty.hs:head ~(a :| _) = a base/Data/List/NonEmpty.hs:tail ~(_ :| as) = as base/Data/List/NonEmpty.hs:last ~(a :| as) = List.last (a : as) base/Data/List/NonEmpty.hs:init ~(a :| as) = List.init (a : as) base/Data/List/NonEmpty.hs:a <| ~(b :| bs) = a :| b : bs base/Data/List/NonEmpty.hs:toList ~(a :| as) = a : as base/Data/List/NonEmpty.hs:map f ~(a :| as) = f a :| fmap f as base/Data/List/NonEmpty.hs:scanl1 f ~(a :| as) = fromList (List.scanl f a as) base/Data/List/NonEmpty.hs:scanr1 f ~(a :| as) = fromList (List.scanr1 f (a:as)) base/Data/List/NonEmpty.hs:intersperse a ~(b :| bs) = b :| case bs of base/Data/List/NonEmpty.hs:(!!) ~(x :| xs) n base/Data/List/NonEmpty.hs:zip ~(x :| xs) ~(y :| ys) = (x, y) :| List.zip xs ys base/Data/List/NonEmpty.hs:zipWith f ~(x :| xs) ~(y :| ys) = f x y :| List.zipWith f xs ys base/Data/Traversable.hs: traverse f ~(a :| as) = liftA2 (:|) (f a) (traverse f as) base/GHC/Base.hs: (a :| as) <> ~(b :| bs) = a :| (as ++ b : bs) base/GHC/Base.hs: fmap f ~(a :| as) = f a :| fmap f as base/GHC/Base.hs: b <$ ~(_ :| as) = b :| (b <$ as) base/GHC/Base.hs: ~(a :| as) >>= f = b :| (bs ++ bs') base/GHC/Base.hs: toList ~(c :| cs) = c : cs base/GHC/Exts.hs: toList ~(a :| as) = a : as On 8.1.2021 22.03, David Feuer wrote:
I think removing the annotations that don't change anything can be done in a GHC MR without discussion on this list. I think the discussion on things that change strictness can and should continue here.
On Fri, Jan 8, 2021, 2:59 PM Oleg Grenrus
mailto:oleg.grenrus@iki.fi> wrote: I'd expect that anyone who uses mfix with NonEmpty as result would use explicit (and irrefutable) pattern matching.
But yes, changing these might make some code break. I'm not confident at all it won't make some code less efficient too, by forcing the structure of NonEmpty too early.
So I would like that this thread is only about changing `head` and `tail` and not let scope creep. OR we hold this and let Keith come up with more complete NonEmpty implementation change.
- Oleg
On 8.1.2021 21.50, Viktor Dukhovni wrote: > On Fri, Jan 08, 2021 at 09:44:31PM +0200, Oleg Grenrus wrote: >> Note also >> >> -- | @since 4.9.0.0 >> instance Foldable NonEmpty where >> foldr f z ~(a :| as) = f a (List.foldr f z as) >> foldl f z (a :| as) = List.foldl f (f z a) as >> foldl1 f (a :| as) = List.foldl f a as >> >> -- GHC isn't clever enough to transform the default definition >> -- into anything like this, so we'd end up shuffling a bunch of >> -- Maybes around. >> foldr1 f (p :| ps) = foldr go id ps p >> where >> go x r prev = f prev (r x) >> >> -- We used to say >> -- >> -- length (_ :| as) = 1 + length as >> -- >> -- but the default definition is better, counting from 1. >> -- >> -- The default definition also works great for null and foldl'. >> -- As usual for cons lists, foldr' is basically hopeless. >> >> foldMap f ~(a :| as) = f a `mappend` foldMap f as >> fold ~(m :| ms) = m `mappend` fold ms >> toList ~(a :| as) = a : as >> >> Plenty of irrefutable patterns. > Do any of these make "mfix" more usable for NonEmpty? Or are they just > superfluous? With just one constructor, is there any downside to an > irrefutable pattern? > _______________________________________________ Libraries mailing list Libraries@haskell.org mailto:Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

The semigroup instance for example looks like an mistake. (There is no comment). And it's the same in semigroups package https://github.com/ekmett/semigroups/blob/738e343a4384994903131190b6bfd50e40... It always was this way, https://github.com/ekmett/semigroups/commit/3b37f1600bb0eec49d453c2ffcda1eb0... I don't remember whether the irrefutable patterns were discussed when Semigroup + NonEmpty was moved to base. (I haven't followed libraries closed then). - Oleg On 8.1.2021 22.08, Oleg Grenrus wrote:
Agreed.
But to make discussion more productive I suggest that someone (you, Keith?) goes through the list and makes concrete suggestion for each point. It's not that long.
ghc/libraries % git grep ':|' | grep '~' base/Control/Monad/Fix.hs: ~(x :| _) -> x :| mfix (neTail . f) base/Control/Monad/Fix.hs: neHead ~(a :| _) = a base/Control/Monad/Fix.hs: neTail ~(_ :| as) = as base/Data/Foldable.hs: foldr f z ~(a :| as) = f a (List.foldr f z as) base/Data/Foldable.hs: foldMap f ~(a :| as) = f a `mappend` foldMap f as base/Data/Foldable.hs: fold ~(m :| ms) = m `mappend` fold ms base/Data/Foldable.hs: toList ~(a :| as) = a : as base/Data/List/NonEmpty.hs:uncons ~(a :| as) = (a, nonEmpty as) base/Data/List/NonEmpty.hs:head ~(a :| _) = a base/Data/List/NonEmpty.hs:tail ~(_ :| as) = as base/Data/List/NonEmpty.hs:last ~(a :| as) = List.last (a : as) base/Data/List/NonEmpty.hs:init ~(a :| as) = List.init (a : as) base/Data/List/NonEmpty.hs:a <| ~(b :| bs) = a :| b : bs base/Data/List/NonEmpty.hs:toList ~(a :| as) = a : as base/Data/List/NonEmpty.hs:map f ~(a :| as) = f a :| fmap f as base/Data/List/NonEmpty.hs:scanl1 f ~(a :| as) = fromList (List.scanl f a as) base/Data/List/NonEmpty.hs:scanr1 f ~(a :| as) = fromList (List.scanr1 f (a:as)) base/Data/List/NonEmpty.hs:intersperse a ~(b :| bs) = b :| case bs of base/Data/List/NonEmpty.hs:(!!) ~(x :| xs) n base/Data/List/NonEmpty.hs:zip ~(x :| xs) ~(y :| ys) = (x, y) :| List.zip xs ys base/Data/List/NonEmpty.hs:zipWith f ~(x :| xs) ~(y :| ys) = f x y :| List.zipWith f xs ys base/Data/Traversable.hs: traverse f ~(a :| as) = liftA2 (:|) (f a) (traverse f as) base/GHC/Base.hs: (a :| as) <> ~(b :| bs) = a :| (as ++ b : bs) base/GHC/Base.hs: fmap f ~(a :| as) = f a :| fmap f as base/GHC/Base.hs: b <$ ~(_ :| as) = b :| (b <$ as) base/GHC/Base.hs: ~(a :| as) >>= f = b :| (bs ++ bs') base/GHC/Base.hs: toList ~(c :| cs) = c : cs base/GHC/Exts.hs: toList ~(a :| as) = a : as
On 8.1.2021 22.03, David Feuer wrote:
I think removing the annotations that don't change anything can be done in a GHC MR without discussion on this list. I think the discussion on things that change strictness can and should continue here.
On Fri, Jan 8, 2021, 2:59 PM Oleg Grenrus
mailto:oleg.grenrus@iki.fi> wrote: I'd expect that anyone who uses mfix with NonEmpty as result would use explicit (and irrefutable) pattern matching.
But yes, changing these might make some code break. I'm not confident at all it won't make some code less efficient too, by forcing the structure of NonEmpty too early.
So I would like that this thread is only about changing `head` and `tail` and not let scope creep. OR we hold this and let Keith come up with more complete NonEmpty implementation change.
- Oleg
On 8.1.2021 21.50, Viktor Dukhovni wrote: > On Fri, Jan 08, 2021 at 09:44:31PM +0200, Oleg Grenrus wrote: >> Note also >> >> -- | @since 4.9.0.0 >> instance Foldable NonEmpty where >> foldr f z ~(a :| as) = f a (List.foldr f z as) >> foldl f z (a :| as) = List.foldl f (f z a) as >> foldl1 f (a :| as) = List.foldl f a as >> >> -- GHC isn't clever enough to transform the default definition >> -- into anything like this, so we'd end up shuffling a bunch of >> -- Maybes around. >> foldr1 f (p :| ps) = foldr go id ps p >> where >> go x r prev = f prev (r x) >> >> -- We used to say >> -- >> -- length (_ :| as) = 1 + length as >> -- >> -- but the default definition is better, counting from 1. >> -- >> -- The default definition also works great for null and foldl'. >> -- As usual for cons lists, foldr' is basically hopeless. >> >> foldMap f ~(a :| as) = f a `mappend` foldMap f as >> fold ~(m :| ms) = m `mappend` fold ms >> toList ~(a :| as) = a : as >> >> Plenty of irrefutable patterns. > Do any of these make "mfix" more usable for NonEmpty? Or are they just > superfluous? With just one constructor, is there any downside to an > irrefutable pattern? > _______________________________________________ Libraries mailing list Libraries@haskell.org mailto:Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

(!!) also has a confusing ~ in it; best remove that too.
On Fri, Jan 8, 2021 at 11:53 AM Keith
Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
? --Keith Sent from my phone with K-9 Mail.
On January 4, 2021 2:40:58 PM UTC, John Ericson
wrote: I talked to Carter a bit on IRC for my progress on that front, but I thought maybe this would be a good time to mention this more widely
- The constraint side is iffy. Local constraints and constraint kinds make it hard to have some sort of codata guardedness / cotermination checking argument for higher order coercion "instances" that doesn't also need to apply to the constraint system at large, which makes it quite laborious to increase expressive power without trade-offs like no local quantified constraints. (Yay mission creep.)
- The core side looks good. Cale and I pretty confident in the "coercions as fixed points of products", with {0, 1, multiplication, and exponentiation, limits} passing my cardinality sniff test that coercions still have no computational content and thus can be erased.
- Additionally, I am less but decently confident (though I haven't talked to Cale about this) that the existing role admissibility solver can be repurposed to produce those (to-be-erased) terms rather than just merely deciding the admissibility of (opaque) axiomatic coercions. This change would have no expressive power implications one way or the other, but complete the "theory refactor" so that the "sans-nth" version could be said to work end to end.
So tl;dr I can't actually do anything to help Carter's problem at the moment, but I think I can get David's https://github.com/ghc-proposals/ghc-proposals/pull/276 over the finish line, with the side benefit of loosening things up and getting us closer so the higher-order roles problem seems less out of reach.
I have revised my "progress report" wildly since I started thinking about these things, but with the latest ratchet back, I think I finally have a stable prediction.
Cheers,
John
On 1/4/21 9:12 AM, Carter Schonwald wrote:
Thx for the link. I’ll take a look at your suggested reading.
What are ways I could help progress whatever’s needed to get to a nice ending?
On Mon, Jan 4, 2021 at 9:00 AM Richard Eisenberg
wrote: On Jan 3, 2021, at 1:02 PM, Carter Schonwald
wrote: This limitation is a misfeature, how can we make this get addressed sooner rather than later? Is this somewhere where Eg Haskell foundation or something could help?
Lifting the limitation would be nice, but it's a lot of work. First, we need an updated theory for Core, with a type safety proof. This proof is essential: it's what our safety as a language depends on. Then, we'd need to implement it. I'm more worried about the former than the latter.
i think its worth emphasizing that ghc today uses a simplification of the original 2011 paper...
Yes, that was originally true, but the current formulation goes beyond the 2011 paper in some respects. See section 7.1 of https://richarde.dev/papers/2016/coercible-jfp/coercible-jfp.pdf.
Roman writes:
I think it's important we keep the definitions of Functor and other fundamental classes understandable by newcomers, and this change would make the definition look scary for a marginal benefit.
This is tough. I've considered a Functor definition like the one Carter proposes before. I would personally rather come up with the best definition first, then figure out how to make it palatable to newcomers second. For example, we could write (today)
type Representational f = forall a b. Coercible a b => Coercible (f a) (f b)
and then the class constraint looks more pleasant. Or we could create ways of suppressing confusing information. Or there are other solutions. Depending on the benefit of the change (here or elsewhere), I would advocate holding off on making the change until we can support it without disrupting the newcomer story. But I wouldn't want to abandon the idea of an improvement a priori just because of a disruption to the newcomer experience.
Richard
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

zip and zipWith also look excessively lazy to my eyes.
On Fri, Jan 8, 2021 at 2:43 PM David Feuer
(!!) also has a confusing ~ in it; best remove that too.
On Fri, Jan 8, 2021 at 11:53 AM Keith
wrote: Currently:
head ~(a :| _) = a tail ~(_ :| as) = as
But head and tail are both strict. At best the '~'s have no effect.
Should I open a PR to change it to
head (a :| _) = a tail (_ :| as) = as
or maybe even more clearly
head !(a :l _) = a tail !(_ :| as) = as
? --Keith Sent from my phone with K-9 Mail.
On January 4, 2021 2:40:58 PM UTC, John Ericson
wrote: I talked to Carter a bit on IRC for my progress on that front, but I thought maybe this would be a good time to mention this more widely
- The constraint side is iffy. Local constraints and constraint kinds make it hard to have some sort of codata guardedness / cotermination checking argument for higher order coercion "instances" that doesn't also need to apply to the constraint system at large, which makes it quite laborious to increase expressive power without trade-offs like no local quantified constraints. (Yay mission creep.)
- The core side looks good. Cale and I pretty confident in the "coercions as fixed points of products", with {0, 1, multiplication, and exponentiation, limits} passing my cardinality sniff test that coercions still have no computational content and thus can be erased.
- Additionally, I am less but decently confident (though I haven't talked to Cale about this) that the existing role admissibility solver can be repurposed to produce those (to-be-erased) terms rather than just merely deciding the admissibility of (opaque) axiomatic coercions. This change would have no expressive power implications one way or the other, but complete the "theory refactor" so that the "sans-nth" version could be said to work end to end.
So tl;dr I can't actually do anything to help Carter's problem at the moment, but I think I can get David's https://github.com/ghc-proposals/ghc-proposals/pull/276 over the finish line, with the side benefit of loosening things up and getting us closer so the higher-order roles problem seems less out of reach.
I have revised my "progress report" wildly since I started thinking about these things, but with the latest ratchet back, I think I finally have a stable prediction.
Cheers,
John
On 1/4/21 9:12 AM, Carter Schonwald wrote:
Thx for the link. I’ll take a look at your suggested reading.
What are ways I could help progress whatever’s needed to get to a nice ending?
On Mon, Jan 4, 2021 at 9:00 AM Richard Eisenberg
wrote: On Jan 3, 2021, at 1:02 PM, Carter Schonwald
wrote: This limitation is a misfeature, how can we make this get addressed sooner rather than later? Is this somewhere where Eg Haskell foundation or something could help?
Lifting the limitation would be nice, but it's a lot of work. First, we need an updated theory for Core, with a type safety proof. This proof is essential: it's what our safety as a language depends on. Then, we'd need to implement it. I'm more worried about the former than the latter.
i think its worth emphasizing that ghc today uses a simplification of the original 2011 paper...
Yes, that was originally true, but the current formulation goes beyond the 2011 paper in some respects. See section 7.1 of https://richarde.dev/papers/2016/coercible-jfp/coercible-jfp.pdf.
Roman writes:
I think it's important we keep the definitions of Functor and other fundamental classes understandable by newcomers, and this change would make the definition look scary for a marginal benefit.
This is tough. I've considered a Functor definition like the one Carter proposes before. I would personally rather come up with the best definition first, then figure out how to make it palatable to newcomers second. For example, we could write (today)
type Representational f = forall a b. Coercible a b => Coercible (f a) (f b)
and then the class constraint looks more pleasant. Or we could create ways of suppressing confusing information. Or there are other solutions. Depending on the benefit of the change (here or elsewhere), I would advocate holding off on making the change until we can support it without disrupting the newcomer story. But I wouldn't want to abandon the idea of an improvement a priori just because of a disruption to the newcomer experience.
Richard
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

On 03/01/2021 17.59, Carter Schonwald wrote:
this seems like it'd be best done via something like changing the functor class definition to
``` class (forall c d . Coercible c d => Coercible (f c) (f d)) ) => Functor f where .. ```
I think it's important we keep the definitions of Functor and other fundamental classes understandable by newcomers, and this change would make the definition look scary for a marginal benefit. Roman

So this actually is a very good point!
Happily, the technological steps needed to resolve issues that other
comments so far have raised point to a better fix!
Borrowing from the 2011 paper, we would write the following
‘’’
class Functor (f : Type/representational -> Type) where
‘’’
Basically this then pushes the info into kind signatures. As was
originally intended. And role inferred/ annotated kind signatures provides
a mechanism for gnd to work again for monad transformers and unvoxed vector
On Mon, Jan 4, 2021 at 5:50 AM Roman Cheplyaka
On 03/01/2021 17.59, Carter Schonwald wrote:
this seems like it'd be best done via something like changing the functor class definition to
``` class (forall c d . Coercible c d => Coercible (f c) (f d)) ) => Functor f where .. ```
I think it's important we keep the definitions of Functor and other fundamental classes understandable by newcomers, and this change would make the definition look scary for a marginal benefit.
Roman _______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
participants (10)
-
Carter Schonwald
-
David Feuer
-
Henning Thielemann
-
John Ericson
-
Keith
-
Oleg Grenrus
-
Richard Eisenberg
-
Roman Cheplyaka
-
Tom Ellis
-
Viktor Dukhovni