El primer presupuesto del paradigma funcional es caracterizar un problema como una función entre conjuntos, a ser definida.
Tal función podría definirse por extensión, si todos los pares de correspondientes fueran conocidos, o bien, en el caso más general, por una expresión que, convenientemente manipulada, determine la imagen de cada objeto del dominio.
Un ejemplo, de aspecto seguramente familiar, de una tal definición es:
En definiciones como la anterior, se llama a un argumento nominal de , y será, en todos los casos, una variable que denota un valor genérico del dominio de la función.
A la derecha del símbolo de igualdad hay una expresión que denota la imagen del valor del argumento nominal en la función que está siendo definida. Es útil analizar esta expresión con detalle:
En ella aparecen los símbolos y , que (es de suponer) denotan las funciones producto y suma, aplicadas a constantes y al argumento . De este modo se indica que, para calcular la imagen de en deben usarse otras funciones, aplicándolas a y a ciertos valores convenientes. De modo que, en definitiva, la definición de se muestra como una combinación adecuada de otras funciones.
En general, podría requerirse que las funciones así usadas tuvieran que ser, a su vez, definidas. Esto conduciría, en el caso anterior, a complementar la definición dada con un par de expresiones, de la misma forma, para y , en las cuales habrán de introducirse, a su vez, nuevas funciones. De esta manera:
Este esquema evoca uno de los aspectos más importantes de las técnicas de diseño modular, en particular, la idea de descomposición de un problema complejo en componentes más simples (módulos) que se combinan convenientemente.
Cada uno de ellos representa, nuevamente, un problema que, o bien tiene una solución sobreentendida, o bien es, a su vez, descompuesto de igual forma.
Como en el caso de y , los módulos pueden ser referenciados apenas por un nombre. Esta facilidad es importante, puesto que hace posible que el empleo de un módulo no involucre el conocimiento de su estructura interna, que podría ser compleja, sino simplemente su afecto. Luego, tal estructura puede desarrollarse por separado, asociándola al nombre utilizado a través de otra definición.
Algunos de estos nombres no necesitan tener sus propias definiciones, conviniendose que sus significados son sobreentendidos: corresponderán a modulos primitivos. Los que no sean primitivos, se llamarán abstractos.
Nótese que unos y otros no se distinguen desde el punto de vista de su forma de uso. En ambos casos, ésta consiste, en principio, en citar su nombre.
De hecho, los módulos abstractos pueden pensarse, en virtud de esta característica, como «primitivas potentes». La idea caracteriza el diseño por refinamientos sucesivos:
La estructura de un problema complejo puede diseñarse en términos de componentes pensados como «ya resueltos», que además, pueden efectivamente usarse como tales. Tales componentes se definirán en un siguiente nivel de detalle, si no son primitivos.
Sin embargo, la elección de estos componentes para un problema arbitrario dado no es, en modo alguno, trivial. El enfoque anterior se complementa, en este sentido, con la idea de elegir la descomposición de modo que puedan emplearse, en todo lo posible, soluciones ya desarrolladas, con un mínimo costo de adaptación.
En términos de los lenguajes de programación, ésto hace interesante el estudio de las facilidades que ellos proveen para definir y emplear módulos de aplicación general. Como se verá más adelante, dichas facilidades constituyen uno de los principales atributos de los lenguajes funcionales.
Algunas de estas ideas comenzarán a ser aplicadas enseguida.