Je vais devoir être d'accord avec simonuk. Bien que, comme CMS a mentionné, hd
et tl
sont les fonctions correctes, il n'y a plus alors à l'argument que. Lorsque vous utilisez la correspondance de formes, vous pouvez exploiter la capacité des compilateurs à attraper les cas (de base) que vous avez peut-être manqués (par exemple lorsque la liste est vide). Vous pouvez certainement attraper ou continuer à lancer cette exception, mais vous n'êtes pas obligé de le faire et vous pourriez introduire des bogues si cette attente ne se produit pas souvent. Donc, prendre l'habitude d'exploiter le pattern matching est une bonne pratique de programmation. Pour toutes fins utiles la fonction réelle est appliquée lors de l'appel hd
/tl
IS correspondant à un modèle. En fait, en OCaml, c'est un échec:
let hd = function [] -> failwith "hd" | a::l -> a
let tl = function [] -> failwith "tl" | a::l -> l
À titre d'exemple, au lieu d'utiliser des exceptions/échecs que nous pourrions trouver plus satisfaisant d'utiliser options
:
> let car = function | hd::tl -> Some hd | _ -> None
> let cdr = function | hd::[] -> None | hd :: tl -> Some tl | _ -> None
Aussi, méfiez-vous d'utiliser _
pour correspondre à n'importe quoi. Ça fait plus mal dans les types de variantes quand vous décidez d'ajouter un autre type ... opps!