Poniższy kod C# działa jak się spodziewałem, drukowanie `łączone jako„A”:Dlaczego nie można sparametryzować nie-częściowych aktywnych wzorców w F #?
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'])
Jednak jeśli zmienię Char
z częściowego aktywnego wzoru do całkowitego aktywnego wzoru następująco:
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'])
Następnie kod nie skompilować, dając się następujący komunikat o błędzie: error FS0191: Only active patterns returning exactly one result may accept arguments.
Ten przykład może wyglądać nieco wymyślony, ale to uproszczona wersja aktywnego wzoru próbowałem użyć w Prolo g lexer, nad którym pracowałem w wolnym czasie. Mogę z łatwością przepisać mój kod, aby uniknąć tego problemu, ale jestem ciekawy, dlaczego ten rodzaj kodu jest niedozwolony.
Aktualizacja: nowsze wersje F # wydaje się przemianowany ten błąd:
error FS0722: Only active patterns returning exactly one result may accept arguments