on master help sign in
Improve inference for param
commit7260c2498fed872cc43449ad04354155c4535de4 authorCsongor Kiss <kiss.csongor.kiss@gmail.com> dateFri 9 Mar 2018, 16:32 (9 years ago) parent3e9221c
2 files changed+10−2
src/Data/Generics/Internal/Families/Changing.hs+6 src/Data/Generics/Product/Param.hs+4−2
src/Data/Generics/Internal/Families/Changing.hs+6
@@ -14,6 +14,7 @@ module Data.Generics.Internal.Families.Changing
1414 , PTag (..)
1515 , P
1616 , LookupParam
17+ , ArgAt
1718 , ArgCount
1819 ) where
1920
@@ -123,6 +124,11 @@ type family ArgCount (t :: k) :: Nat where
123124 ArgCount (f a) = 1 + ArgCount f
124125 ArgCount a = 0
125126
127+type family ArgAt (t :: k) (n :: Nat) :: j where
128+ ArgAt (t a) 0 = a
129+ ArgAt (t a) n = ArgAt t (n - 1)
130+
131+
126132-- Note [CPP in instance constraints]
127133-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
128134--
src/Data/Generics/Product/Param.hs+4−2
@@ -1,3 +1,4 @@
1+{-# LANGUAGE PolyKinds #-}
12{-# LANGUAGE TypeFamilies #-}
23{-# LANGUAGE AllowAmbiguousTypes #-}
34{-# LANGUAGE DataKinds #-}
@@ -33,14 +34,13 @@ import GHC.TypeLits
3334import Data.Generics.Internal.Void
3435import Data.Generics.Internal.Families.Changing
3536import Data.Generics.Internal.VL.Traversal
36−import Data.Generics.Internal.VL.Lens
3737
3838import GHC.Generics
3939import Data.Kind
4040import Data.Generics.Internal.VL.Iso
4141import Data.Generics.Internal.GenericN
4242
43−class HasParam (p :: Nat) s t a b | p t a b -> s, p s a b -> t where
43+class HasParam (p :: Nat) s t a b | p t a b -> s, p s a b -> t, p s -> a, p t -> b where
4444 param :: Applicative g => (a -> g b) -> s -> g t
4545
4646instance
@@ -50,6 +50,8 @@ instance
5050 , s ~ Infer t (P n b 'PTag) a
5151 , t ~ Infer s (P n a 'PTag) b
5252 , Error ((ArgCount s) <=? n) n (ArgCount s) s
53+ , a ~ ArgAt s n
54+ , b ~ ArgAt t n
5355 , GHasParam n (RepN s) (RepN t) a b
5456 ) => HasParam n s t a b where
5557