(forall a b . Coercible a b => Coercible (f a) (f b)) => Representational f
Проблема в основном в том что это не суперкласс функтора[1]. А так вполне можно сделать
class (forall a b . Coercible a b => Coercible (f a) (f b)) => Representational f
type RLens s t a b = forall f . (Functor f, Representational f) => (a -> f b) -> s -> f t
type RLens' s a = RLens s s a a
class X a where
f :: RLens' a Int
newtype Y a = Y (Int, a)
instance X (Y a) where f = undefined
newtype Z = Z (Int, Bool)
deriving via Y Bool instance X Z
И все будет прекрасно работать. Странно только что не standalone deriving не работает с сouldn't match representation of type, подозреваю что баг
[1]: Кметт говорит что это сильно поломает некоторые оптимизированные монады, так что наверное лучше бы было если бы именно оптика определялась через такой функтор https://www.reddit.com/r/haskell/comments/nyob5b/comment/h1l905t/?utm_source=share&utm_medium=web2x&context=3
да про это я уже писал
Обсуждают сегодня