← Retour au blog
tech 3 septembre 2026

Expressions conditionnelles dépendantes sans types dépendants

Découvrez comment implémenter des expressions conditionnelles dépendantes en Haskell sans recourir aux types dépendants, grâce à une astuce ingénieuse utilisant le Church encoding.

Article inspiré de la source originale
Dependent if expressions without dependent types ↗ haskellforall.com

Introduction

Dans le monde de la programmation fonctionnelle, les types dépendants sont souvent vus comme une solution puissante pour permettre des vérifications de types plus fines. Cependant, ils peuvent être complexes à implémenter et à comprendre. Que dirais-tu de pouvoir réaliser des expressions conditionnelles qui semblent nécessiter des types dépendants, sans réellement les utiliser ? C'est exactement ce que cet article propose grâce à une astuce élégante exploitant le Church encoding.

Le problème

Prenons un exemple simple en Haskell. Supposons que tu souhaites écrire une fonction qui retourne soit un entier, soit une chaîne en fonction d'une condition booléenne. En règle générale, cela nécessiterait des types dépendants, car le type de retour dépend de la valeur de la condition. Voici un exemple de ce que nous voulons accomplir :

``haskell example :: Bool -> Either Int String example bool = if bool then Left 5 else Right "hi!" ``

Les types dépendants

Les types dépendants permettent de définir des types qui dépendent de valeurs. Cela signifie que le type de retour de ta fonction pourrait changer en fonction de l'entrée, ce qui est parfait pour notre exemple. Cependant, tous les langages ne supportent pas les types dépendants, et même dans ceux qui le font, leur utilisation peut être complexe.

L'astuce du Church encoding

Le Church encoding est une technique qui permet de représenter des structures de données et des opérations sur celles-ci à l'aide de fonctions pures. Pour notre problème, nous pouvons utiliser le Church encoding pour représenter des valeurs booléennes.

Implémentation du Church encoding

Voici comment nous pouvons définir des booléens Church-encodés en Haskell :

```haskell {-# LANGUAGE RankNTypes #-}

import Prelude hiding (Bool(..), not, (&&), (||))

type Bool = forall a. a -> a -> a

true :: Bool true thenBranch elseBranch = thenBranch

false :: Bool false thenBranch elseBranch = elseBranch ```

Ces booléens sont des fonctions qui prennent deux arguments et retournent l'un d'eux, selon que la valeur booléenne est true ou false. Cela nous permet de simuler des expressions conditionnelles.

Utilisation dans une expression conditionnelle dépendante

Nous pouvons maintenant utiliser ces booléens Church-encodés dans une fonction ifThenElse qui imite une expression conditionnelle traditionnelle :

``haskell ifThenElse :: Bool -> a -> a -> a ifThenElse condition thenBranch elseBranch = condition thenBranch elseBranch ``

Exemple pratique

Maintenant, nous pouvons utiliser cette approche pour implémenter notre fonction example :

```haskell example :: Bool -> Either Int String example bool = ifThenElse bool (Left 5) (Right "hi!")

main = do print (example false) -- Right "hi!" print (example true) -- Left 5 ```

Cela fonctionne comme prévu, sans avoir besoin de types dépendants, grâce à l'astuce du Church encoding.

Conclusion

En utilisant le Church encoding, tu peux implémenter des expressions conditionnelles dépendantes dans des langages qui ne supportent pas directement les types dépendants. Cela ouvre la voie à des solutions élégantes et pratiques, sans la complexité des types dépendants.

Discutons de ton projet en 15 minutes.

Références

  • [Haskell for All Blog](https://haskellforall.com/)
Haskell Church encoding dependent types functional programming type inference
Newsletter Deepthix · 100% IA · chaque lundi 8h

Un agent IA lit la tech à ta place.

Notre agent IA scanne ~200 sources par semaine et te livre les meilleurs articles le lundi 8h. Gratuit. 1 clic pour se désinscrire.

Voir la page newsletter →

Tu veux automatiser tes opérations ?

Discutons de ton projet en 15 minutes.

Réserver un call