Sono completamente sconcertato osservando questo comportamento nel mio codice F #, qui tratto da un sessione interattiva:Perché le parentesi significative in F dichiarazioni di 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
>
Sembra ovvio per me che pattern matching su entrambi i Foo e Bar con una singola variabile dovrebbe essere valido - quindi mi chiedevo se qualcuno conoscesse il motivo di questo comportamento strano, o se ti piace considerarlo un bug.
Update: Giusto per chiarire, i tipi riportati di costruttori Foo
e Bar
sono:
> Foo;;
val it : string * int -> foo = <fun:[email protected]>
> Bar;;
val it : string * int -> bar = <fun:[email protected]>
Quindi certamente, essi dovrebbero accettare lo stesso insieme di modelli validi
Grazie per una risposta molto approfondita, anche indicando il pezzo rilevante delle specifiche della lingua! Ma temo che consideri ancora più una mostruosa mostruosità, ora che è intenzionale! :-) – plc
@plc - Immagino che il motivo della differenza sia controllare il limite di interoperabilità con altri linguaggi come C#. In tal caso ti potrebbe interessare se devi creare un'istanza di DU inserendo una tupla pre-costruita o passando gli elementi costitutivi singolarmente. – kvb