namespace Ex

class GetElem (Cont : Type u) (Idx : Type v) (Elem : outParam (Type w)) where
  getElem' (xs : Cont) (i : Idx) : Elem

export GetElem (getElem')

instance : GetElem Lean.Syntax Nat Lean.Syntax where
  getElem' xs i := xs.getArg i

instance : GetElem (Array α) Nat α where
  getElem' xs i := xs[i]'sorry

open Lean

def f (stx : Option Syntax) : Syntax :=
  stx.getD default

def bad (doFor : Syntax) : Syntax :=
  let doForDecls := (getElem' doFor 1).getArgs
  let doForDecl := getElem' doForDecls 1
  f (getElem' doForDecl 1)
