ich durch die Beobachtung dieses Verhalten in meinem F # -Code völlig ratlos bin, hier aus einer interaktiven Sitzung genommen:Warum sind Klammern signifikant in F # Typdeklarationen
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
>
Es scheint mir klar, dass Muster auf beiden Foo passend und Bar mit einer einzelnen Variablen sollte gültig sein - also habe ich mich gefragt, ob jemand den Grund für dieses seltsame Verhalten kannte oder ob Sie mich für einen Fehler halten.
Update: Nur um zu klären, die gemeldeten Arten der Konstrukteure Foo
und Bar
sind:
> Foo;;
val it : string * int -> foo = <fun:[email protected]>
> Bar;;
val it : string * int -> bar = <fun:[email protected]>
So sicher, sollten sie den gleichen Satz von gültigen Mustern
Danke für eine sehr gründliche Antwort, sogar das relevante Teil der Sprachspezifikation! Aber ich befürchte, dass ich es jetzt noch mehr als eine schreckliche Ungeheuerlichkeit ansehe, jetzt, wo es beabsichtigt war! :-) – plc
@plc - Ich würde spekulieren, dass der Grund für den Unterschied darin besteht, die Interop-Grenze mit anderen Sprachen wie C# zu kontrollieren. In diesem Fall ist es wichtig, ob Sie eine DU-Instanz erstellen müssen, indem Sie ein vorkonstruiertes Tupel übergeben oder die einzelnen Elemente einzeln übergeben. – kvb