1
我想在可變參數函數定義fmap
:FMAP了可變參數功能
type family VarArg (args :: [*]) e where
VarArg '[] e = e
VarArg (a ': as) e = a -> VarArg as e
mapVarArg :: forall args e e'
. (e -> e') -> VarArg args e -> VarArg args e'
mapVarArg f = _
這是最接近的解決方案,我發現:
mapVarArg :: forall args e e' . VarArgIso args
=> (e -> e') -> VarArg args e -> VarArg args e'
mapVarArg f = (^. Lens.from varArgIso) . fmap f . (^. varArgIso @args)
data VarArgD (args :: [*]) e where
DNil :: e -> VarArgD '[] e
DCons :: (a -> VarArgD as e) -> VarArgD (a ': as) e
class VarArgIso (args :: [*]) where
varArgIso :: Iso' (VarArg args e) (VarArgD args e)
instance VarArgIso '[] where
varArgIso = iso DNil (\(DNil x) -> x)
instance VarArgIso as => VarArgIso (a ': as) where
varArgIso = iso (\f -> DCons ((^. varArgIso) . f)) (\(DCons f) -> ((^. Lens.from varArgIso) . f))
instance Functor (VarArgD args) where
fmap f (DNil a) = DNil (f a)
fmap f (DCons g) = DCons (fmap f . g)
是否有一個簡單的解決方案,或任何解決方案沒有額外的VarArgIso
約束?