F #: Композиция шаблона?

Я пытаюсь написать шаблон, который состоит из двух других шаблонов, но я не уверен, как это сделать. Мой ввод - это список строк (документ); У меня есть шаблон, который соответствует заголовку документа и шаблону, который соответствует телу документа. Этот шаблон должен соответствовать всему документу и возвращать результаты шаблонов заголовка и тела.

Ответы

Ответ 1

Вы можете запускать два шаблона вместе с помощью &. Вы оставили некоторые детали в своем вопросе, поэтому здесь некоторый код, который я предполагаю, несколько похож на то, что вы делаете.

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

Первый шаблон захватит первый символ строки, а второй вернет все, кроме первого символа. Следующий код демонстрирует, как использовать их вместе.

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

Отпечаток: FOUND: 'H' and "ello!"