El siguiente código C# funciona como esperaba, la impresión de `s Coincide como 'A':¿Por qué no se pueden parametrizar patrones activos no parciales en 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'])
Sin embargo, si cambio Char
de un patrón activa parcial a un patrón activa completa de la siguiente manera:
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'])
continuación, el código falla al compilar, dando el siguiente mensaje de error: error FS0191: Only active patterns returning exactly one result may accept arguments.
Este ejemplo puede parecer un tanto artificial, pero es una versión simplificada de un patrón activa traté de usar en un Prolo g lexer en que he estado trabajando en mi tiempo libre. Puedo reescribir fácilmente mi código para evitar este problema, pero tengo curiosidad acerca de por qué no se permite este tipo de código.
Actualización: las nuevas versiones de F # parecen haber cambiado el nombre de este error:
error FS0722: Only active patterns returning exactly one result may accept arguments