namicBetaReduce mainApp@(LcApp fn arg) =
  let fn'  = dynamicBetaReduce fn
      arg' = dynamicBetaReduce arg
  in  if fn /= fn' || arg /= arg' -- ensure both fn and arg have already been reduced
        then LcApp fn' arg'
        else mainApp
d
dynamicBetaReduce mainApp@(LcApp fn arg) =
  let fn'  = dynamicBetaReduce fn
      arg' = dynamicBetaReduce arg
  in  if fn /= fn' || arg /= arg' -- ensure both fn and arg have already been reduced
        then LcApp fn' arg'
        else mainApp
dynamicBetaReduce mainApp@(LcApp fn arg) =
  let fn'  = dynamicBetaReduce fn
      arg' = dynamicBetaReduce arg
  in  if fn /= fn' || arg /= arg' -- ensure both fn and arg have already been reduced
        then LcApp fn' arg'
        else mainApp