Je viens de franchir un cap. J'ai compris la translation de type dans OCamlduce. C'était pourtant pas dur. Suffisait de lire la doc. Comme d'hab quoi.

Bon, pour les gens déraisonnablement curieux, le point crucial est le suivant (extrait du manuel d'OCamlduce) :

# let f (x : {{ Int }}) = {{ x + 1 }} in List.map f {: [ 1 2 3 ] :};;
- : {{Int}} list = [{{2}}; {{3}}; {{4}}]

In this example, the result type of the translation is inferred to be {{ Int }} list (because the type for f is given). The corresponding x-type is {{ [Int*] }}.

Donc je résume : d'une part, utiliser la bonne syntaxe (forcément, {{ ... }} au lieu de {: ... :} ça ne fonctionne pas) ; d'autre part, indiquer explicitement le type de la fonction appliquée pour que l'inférence de types ne se prenne pas les pieds dans le tapis.

Bon, bah on va pouvoir commencer à coder...