variable {α : Type}
variable {R : Type}

class Zip (α : Type) -- represents `Zero`

class MulAction (R : Type) (β : Type) extends SMul R β

class SMulZeroClass (R α : Type) extends SMul R α where
  smul_zero : ∀ r : R, ∀ a : α, r • a = a

class MulActionWithZero (R α : Type) extends MulAction R α, SMulZeroClass R α

class SMulWithZero (R α : Type) [Zip R] [Zip α] extends SMulZeroClass R α

instance MulActionWithZero.toSMulWithZero (R M : Type)
    [Zip R] [Zip M] [m : MulActionWithZero R M] :
    SMulWithZero R M :=
  { m with }


namespace pi
variable {I : Type}
variable {f : I → Type}

instance instZero [∀ i, Zip (f i)] : Zip (∀ i : I, f i) := ⟨⟩

instance instSMul [∀ i, SMul R (f i)] : SMul R (∀ i : I, f i) :=
  ⟨fun s x => fun i => s • x i⟩

instance smulWithZero (R) [Zip R] [∀ i, Zip (f i)] [∀ i, SMulWithZero R (f i)] :
    SMulWithZero R (∀ i, f i) :=
  { pi.instSMul with
    smul_zero := sorry }

instance mulAction (R) [∀ i, MulAction R (f i)] : MulAction R (∀ i : I, f i) where
  smul := (· • ·)

instance mulActionWithZero (R) [Zip R] [∀ i, Zip (f i)] [∀ i, MulActionWithZero R (f i)] :
    MulActionWithZero R (∀ i, f i) :=
 { pi.mulAction _, pi.smulWithZero _ with }
