Cómo reducir la duplicación de código cuando se trata con tipos de suma recursiva

Actualmente estoy trabajando en un intérprete simple para un lenguaje de programación y tengo un tipo de datos como este: data Expr = Variable String | Number Int | Add [Expr] | Sub Expr Expr Y tengo muchas funciones que hacen cosas simples como: -- Substitute a value for a...