(1) les fonctions doivent être pures (leur valeur de retour ne doit dépendre que de la valeur des paramètres). Ainsi, deux appels identiques exécutés à des moments différents doivent renvoyer la même valeur. (2) les données doivent être immuables (non modifiables), ce qui implique qu’une fonction ne peut pas avoir d’effet de bord (cela veut dire qu’elle ne doit pas modifier les paramètres reçus, y compris s’il s’agit de données structurées tel que des listes ou des dictionnaires). (3) une fonction peut avoir pour paramètre le nom d’une autre fonction. De telles fonctions sont dites d’ordre supérieur. Un exemple classique est la fonction map qui, à partir d’une liste lst de valeurs et du nom d’une fonction f, renvoie une nouvelle liste constituée des résultats de l’application de f à chacun des éléments de lst. (4) une fonction peut faire appel à elle-même. Elle est dite récursive. Par exemple, la fonction factorielle(n) qui renvoie 1 si n < 2 ou n * factorielle(n-1) sinon. (5) une fonction peut être définie comme une application partielle d’une autre. On parle de curryfication. Par exemple, la fonction double(y) peut être définie comme une application partielle de mult(x,y) en fixant la valeur de x à 2.