L'erreur que vous étiez est parce que des choses comme #1
sont un peu spécial et son type dépend de ce qu'il est utilisé. Par exemple, dans #1 (1,2)
, le type de #1
est 'a * 'b -> 'a
; tandis que dans #1 (1,2,3)
, le type de #1
est 'a * 'b * 'c -> 'a
. Il n'y a pas de type comme 'a * ... -> 'a
qui fonctionnera pour tout, donc le compilateur doit être capable de comprendre le type sur lequel il sera utilisé (en gros, combien d'éléments sont dans le tuple).
Donc cela ne fonctionne pas:
fun f lst =
case lst of x::xs => #1 x
| [] => "The list is empty"
parce qu'il sait juste qu'il est « une sorte de liste », et x
est « une valeur d'un certain type ». Mais il ne sait pas quel type de tuple c'est.
ajoutant simplement un agent de type ou un autre contexte qui permet au compilateur de dire quel genre de tuple il est, fonctionnera:
fun f (lst : (string * 'a) list) =
case lst of x::xs => #1 x
| [] => "The list is empty"