Back to flin
flin

Reduce, Map, Filter : fonctions d'ordre supérieur

Comment FLIN implémente les fonctions d'ordre supérieur -- map, filter, reduce, flat_map, zip_with et plus -- comme méthodes intégrées sur les listes avec syntaxe lambda concise et inférence de types complète.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 4 min flin
EN/ FR/ ES
flinfunctionalmapfilterreducehof

La programmation fonctionnelle n'est pas un paradigme. C'est une boîte à outils. La capacité de passer des fonctions comme arguments, de les retourner depuis d'autres fonctions et de les composer en pipelines n'est pas un exercice académique -- c'est la manière la plus pratique de transformer des données dans une application web.

La Session 177 a apporté les fonctions d'ordre supérieur à FLIN. Pas comme un import de bibliothèque. Pas comme une extension fonctionnelle boulonnée. Comme des méthodes intégrées sur chaque liste, avec une syntaxe lambda concise et une inférence de types complète. Le résultat : des pipelines de transformation de données qui se lisent comme de l'anglais, s'exécutent comme du code natif et attrapent les erreurs de type à la compilation.

Les trois fondamentales : Map, Where, Reduce

map : transformer chaque élément

flinnumbers = [1, 2, 3, 4, 5]
doubled = numbers.map(n => n * 2)
// [2, 4, 6, 8, 10]

users = User.all
names = users.map(u => u.name)
// ["Juste", "Thales", "Claude"]

where : garder les éléments correspondants

FLIN utilise where au lieu de filter pour une raison délibérée : cela se lit plus naturellement en anglais. "Users where active" est une pensée complète. "Users filter active" ne l'est pas.

flinevens = numbers.where(n => n.is_even)
// [2, 4, 6, 8, 10]

adults = users.where(u => u.age >= 18)
active_admins = users.where(u => u.is_active and u.role == "admin")

reduce : réduire une liste à une seule valeur

flinnumbers = [1, 2, 3, 4, 5]
total = numbers.reduce(0, (acc, n) => acc + n)
// 15

// Construire un map de fréquences
frequency = words.reduce({}, (acc, word) => {
    count = acc.get(word, 0)
    acc.set(word, count + 1)
})

Au-delà des trois fondamentales

flin// flat_map : mapper et aplatir
users_orders = users.flat_map(u => u.orders)

// zip et zip_with : combiner deux listes
sentences = names.zip_with(ages, (name, age) => "{name} is {age}")

// partition : séparer en deux groupes
result = numbers.partition(n => n.is_even)
evens = result[0]   // [2, 4, 6, 8, 10]
odds = result[1]    // [1, 3, 5, 7, 9]

// group_by : catégoriser les éléments
by_role = users.group_by(u => u.role)

// chunk : découper en groupes de taille fixe
pages = items.chunk(3)
// [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

Chaînage de méthodes : le pattern pipeline

La vraie puissance des fonctions d'ordre supérieur émerge quand vous les chaînez :

flin// Trouver les 5 articles les plus chers achetés par des utilisateurs actifs ce mois-ci
result = orders
    .where(o => o.user.is_active)
    .where(o => o.created_at.is_after(now.start_of_month))
    .flat_map(o => o.items)
    .sort_by(item => item.price)
    .reverse
    .take(5)
    .map(item => {
        name: item.name,
        price: item.price.format(2)
    })

Cette chaîne se lit de haut en bas comme un flux de données. Chaque étape produit une nouvelle liste. Aucune étape ne modifie les données originales. Le pipeline entier est immuable, prévisible et facile à déboguer.

Les douze fonctions d'ordre supérieur

FonctionSignatureBut
map(T -> U) -> [U]Transformer chaque élément
where(T -> bool) -> [T]Garder les correspondants
reject(T -> bool) -> [T]Supprimer les correspondants
reduce(U, (U,T) -> U) -> URéduire à une seule valeur
flat_map(T -> [U]) -> [U]Mapper et aplatir
find(T -> bool) -> T?Première correspondance ou none
find_index(T -> bool) -> int?Index de la première correspondance
any(T -> bool) -> boolTrue si au moins un correspond
all(T -> bool) -> boolTrue si tous correspondent
none_match(T -> bool) -> boolTrue si aucun ne correspond
partition(T -> bool) -> [[T],[T]]Séparer en deux groupes
group_by(T -> K) -> map[K,[T]]Grouper par clé

Douze fonctions qui remplacent les boucles impératives dans 90 % du code de transformation de données. Chacune est une méthode intégrée sur chaque liste. Pas d'imports. Pas de bibliothèque de programmation fonctionnelle. Juste .map, .where et .reduce.


Ceci est la partie 78 de la série "How We Built FLIN", documentant comment un CEO à Abidjan et un CTO IA ont construit des fonctions d'ordre supérieur dans un langage de programmation avec inférence de types complète.

Navigation de la série : - [77] Introspection and Reflection at Runtime - [78] Reduce, Map, Filter: Higher-Order Functions (vous êtes ici) - [79] Validation and Sanitization Functions - [80] Error Tracking and Performance Monitoring

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude deblo

Le jour où Déblo a refusé une bonne réponse — deux fois

Une trace de production a montré Déblo K12 rejetant deux fois de suite la bonne réponse d’un élève de Terminale. Huit heures d’analyse, quatre commits, une rotation A/B de modèles et un benchmark sur 6 modèles plus tard, le tuteur de maths était corrigé. Ce qui a cassé, ce que nous avons changé, et ce que l’échec surprenant de GPT-5.4-mini au test socratique nous a appris sur le choix des modèles pour l’IA éducative.

32 min May 3, 2026
debloclaude-opus-4.7claude-codemethodology +14
Thales & Claude deblo

Web Claude a trouvé le bug. Puis il a failli l’aggraver.

Comment un prompt vocal de 270 lignes pour le tuteur Ultravox de Deblo produisait la même phrase d’accueil scriptu00e9e à chaque appel. Web Claude a diagnostiqué le problème parfaitement, puis a prescrit une correction qui aurait doublé la taille du prompt avec des hooks backend inexistants. Le filtre qui a gardé le diagnostic et rejeté la prescription.

17 min Apr 28, 2026
debloclaude-opus-4.7methodologyprompt-engineering +7
Thales & Claude deblo

Pourquoi j’ai dû corriger Web Claude deux fois sur la stratégie de la page d’accueil de Deblo

Comment une conversation de 48 heures avec Web Claude a failli entraîner Deblo dans le piège généraliste « ChatGPT pour l’Afrique », et pourquoi la connaissance du marché par le fondateur a dû prendre le dessus sur les suggestions stratégiques de l’IA à deux reprises.

26 min Apr 26, 2026
debloclaude-opus-4.7methodologystrategy +6