Следующий код F # работает так, как я ожидал, печатая `Соответствует как 'A':
let (|Char|_|) convf = function
| LazyList.Nil -> None
| LazyList.Cons (x, _) -> Some (convf x)
let test = function
| Char System.Char.ToUpper x -> printfn "Matched as %A" x
| _ -> printfn "Didn't match"
test (LazyList.of_list ['a'])
Однако, если я изменяю Char
от частичного активного шаблона до полного активного шаблона следующим образом:
let (|Char|NoChar|) convf = function
| LazyList.Nil -> NoChar
| LazyList.Cons (x, _) -> Char x
let test = function
| Char System.Char.ToUpper x -> printfn "Matched as %A" x
| NoChar System.Char.ToUpper -> printfn "Didn't match"
test (LazyList.of_list ['a'])
Затем код не скомпилируется, и появляется следующее сообщение об ошибке: error FS0191: Only active patterns returning exactly one result may accept arguments.
Этот пример может выглядеть несколько надуманным, но это упрощенная версия активного шаблона, который я пытался использовать в лексисе Prolog, над которым я работал в свое свободное время. Я могу легко переписать мой код, чтобы избежать этой проблемы, но мне интересно, почему этот вид кода запрещен.
Обновление: более новые версии F #, похоже, переименовали эту ошибку:
error FS0722: Only active patterns returning exactly one result may accept arguments