The function foldr
is a versatile function for list processing:
foldr cons nil [] = nil foldr cons nil (x:xs) = cons x (foldr cons nil xs)
It replaces every (:)
with cons
and []
with
nil
. If you apply this idea to
FlatCurry dataterms instead of lists, you can define selectors, test
and update operations and useful auxiliary functions based on one
primitive for each datatype inspired by the foldr
idea. You get
over 800 lines of boring code and you never need to rewrite it for
your program transformations. Just watch
FlatCurryGoodies and use the versatile predefined functions to do
exactly what you need.
As an example consider a transformation function for type expressions:
trTypeExpr tv tc ft (TVar n) = tv n trTypeExpr tv tc ft (TCons name args) = tc name (map (trTypeExpr tv tc ft) args) trTypeExpr tv tc ft (FuncType from to) = ft (tr from) (tr to) where tr = trTypeExpr tv tc ft
Now you can specialize this function to rename all indices of type
variables with a rename function rename
:
rnmAllVarsInTypeExpr rename = trTypeExpr (TVar . rename) TCons FuncType
Many other typical transformations can be written using such tr…
operations. Hopefully, these goodies can help you writing clear and
brief code!