
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...