In PFL, functions are defined equationally and bulk data is stored using a special class of functions called selectors. PFL is a lazy language, supports higher-order functions, has a strong polymorphic type inference system, and allows new user-defined data types and values. All functions, types and values persist in a database. Functions can be written which update all aspects of the database: by adding data to selectors, by defining new equations, and by introducing new data types and values.
PFL is "semi-referentially transparent", in the sense that whilst updates are referentially opaque and are executed destructively, all evaluation is referentially transparent. Similarly, type checking is "semi-static" in the sense that whilst updates are dynamically type checked at run time, expressions are type checked before they are evaluated and no type errors can occur during their evaluation.
["A Functional Approach to Database Updates (http://web.dcs.bbk.ac.uk/CS/Research/DBPL/papers/INFSYS93.abs.html)", C. Small, Information Systems 18(8), 1993, pp. 581-95].