Estoy completamente desconcertado al observar este comportamiento en mi F # código, aquí tomadas de una sesión interactiva:¿Por qué son paréntesis significativos en F # declaraciones de tipo
Microsoft (R) F# 2.0 Interactive build 4.0.40219.1
Copyright (c) Microsoft Corporation. All Rights Reserved.
For help type #help;;
> type foo = Foo of (string * int);;
type foo = | Foo of (string * int)
> let f = Foo ("bar",42);;
val f : foo = Foo ("bar", 42)
> match f with Foo x -> x;;
val it : string * int = ("bar", 42)
> type bar = Bar of string * int;;
type bar = | Bar of string * int
> let b = Bar ("baz",21);;
val b : bar = Bar ("baz",21)
> match b with Bar x -> x;;
match b with Bar x -> x;;
-------------^^^^^
stdin(7,14): error FS0019: This constructor is applied to 1 argument(s) but expects 2
>
Parece obvio que la coincidencia de patrones en tanto Foo y Bar con una sola variable debería ser válida, así que me preguntaba si alguien conocía el motivo de este extraño comportamiento, o si me gusta, lo considero un error.
Actualización: Solo para aclarar, los tipos registrados de los constructores Foo
y Bar
son:
> Foo;;
val it : string * int -> foo = <fun:[email protected]>
> Bar;;
val it : string * int -> bar = <fun:[email protected]>
Así que sin duda, se debe aceptar el mismo conjunto de patrones válidos
Gracias por una respuesta muy completa, incluso señalando la pieza relevante de la especificación de idioma! Pero me temo que ahora lo considero una monstruosidad más grave, ¡ahora que fue intencional! :-) – plc
@plc - Especulo que el motivo de la diferencia es controlar el límite de interoperabilidad con otros lenguajes como C#. En ese caso, le puede interesar si necesita crear una instancia de DU pasando una tupla preconstruida o pasando los elementos constituyentes de forma individual. – kvb