2010-09-10 5 views
10

J'essaie d'écrire un motif qui compose deux autres motifs, mais je ne suis pas sûr de la façon de procéder. Mon entrée est une liste de chaînes (un document); J'ai un motif qui correspond à l'en-tête du document et un motif qui correspond au corps du document. Ce modèle doit correspondre au document entier et renvoyer les résultats des modèles d'en-tête et de corps.F #: Composition de motifs?

+1

Je ne sais pas ce que vous essayez de faire ici, vous pouvez poster votre entrée et la sortie désirée et tout code que vous avez écrit jusqu'à présent? – Juliet

Répondre

23

Vous pouvez exécuter deux modèles ensemble en utilisant &. Vous avez omis certains détails dans votre question, alors voici un code que je suppose être assez semblable à ce que vous faites.

let (|Header|_|) (input:string) = 
    if input.Length > 0 then 
     Some <| Header (input.[0]) 
    else 
     None 

let (|Body|_|) (input:string) = 
    if input.Length > 0 then 
     Some <| Body (input.[1..]) 
    else 
     None 

Le premier motif va saisir le premier caractère d'une chaîne, et le second retournera tout sauf le premier caractère. Le code suivant montre comment les utiliser ensemble.

match "Hello!" with 
| Header h & Body b -> printfn "FOUND: %A and %A" h b 
| _ ->() 

Ceci affiche: FOUND: 'H' and "ello!"

+0

+1 Appris quelque chose de nouveau! – Dario

+0

Tant de puissance par conception. incroyable. – nicolas

+0

Par curiosité, pourquoi utilisez-vous '<|'? –