Jak ograniczyć duplikację kodu w przypadku typów sum rekurencyjnych

Obecnie pracuję nad prostym tłumaczem dla języka programowania i mam taki typ danych: data Expr = Variable String | Number Int | Add [Expr] | Sub Expr Expr I mam wiele funkcji, które wykonują proste rzeczy, takie jak: -- Substitute a value for a variable substituteName :: String -> Int...