Building a static analyser for a real language involves modeling of large domains capturing the many available data types. To scale domain design and support efficient development of project-specific analyzers, it is desirable to be able to build, extend, and change abstractions in a systematic and modular fashion. We present a framework for modular design of abstract domains for recursive types and higher-order functions, based on the theory of solving recursive domain equations. We show how to relate computable abstract domains to our framework, and illustrate the potential of the construction by modularizing a monolithic domain for regular tree grammars. A prototype implementation in the dependently typed functional language Agda shows how the theoretical solution can be used in practice to construct static analysers. Authors ordered alphabetically type Fml = Atom ( int ) | Neg ( Fml ) | And ( Fml , Fml ) | Or ( Fml , Fml ) nnf ( f : Fml ) = case f of | Atom ( i ) -> Atom ( i ) | Neg ( Atom ( i )) -> Neg ( Atom ( i )) | Neg ( Neg ( f )) -> nnf f | Neg ( And ( f1 , f2 )) -> Or ( nnf ( Neg f1 ) , nnf ( Neg f2 )) | Neg ( Or ( f1 , f2 )) -> And ( nnf ( Neg f1 ) , nnf ( Neg f2 )) | Or ( f1 , f2 ) -> Or ( nnf f1 , nnf f2 ) | And ( f1 , f2 ) -> And ( nnf f1 , nnf f2 ) bool = unit+unit x0 : A0, . . . , xn : An ex xi : Ai Γ ex n : int Γ ex tt : unit Γ ex e1 : int Γ ex e2 : int Γ ex e1 e2 : int ( ∈ {+, −, ×}) Γ ex e1 : int Γ ex e2 : int Γ ex e1 ≤ e2 : bool Γ ex e1 : A1 Γ ex e2 : A2 Γ ex (e1, e2