2014-01-22 5 views
15

Nehmen wir an, ich möchte einen Thread innerhalb eines do -Notationsblocks abzweigen, aber die Thread-ID interessiert mich nicht. Wenn ichVerwendet Musternamen, die mit "_" (Unterstrich) beginnen, für ignorierte Ergebnisse, die dokumentiert/empfohlen/portabel sind?

forkIO action 

GHC Fragen schreiben

Warnung Warnung: Eine do -Notation Anweisung verworfen ein Ergebnis vom Typ ThreadId. Unterdrückt diese Warnung sagen

_ <- forkOS action 

Dies ist eine gute Idee, wie ich, dass das Programm zeigen, wollen einige Ergebnis wird verworfen. Auf diese Weise wird jedoch nicht ersichtlich, was verworfen wird. Ich konnte

threadId <- forkIO action 

schreiben, aber dann sind wir verstecken die Tatsache, dass wir threadId nicht überall verwenden und GHC warnt richtig

Warnung: Definierte aber nicht verwendet: threadId

Es scheint, dass der vorangestellte Unterstrich beide Probleme löst:

Meine Fragen sind: Verwendet die Verwendung von Variablen, die mit Unterstrichen beginnen, laut Haskells Sprachspezifikation? Wie tragbar ist es? Ist es irgendwo dokumentiert? Ist es für Fälle wie diesen ermutigt - zu dokumentieren, dass ein Ergebnis ignoriert wird?

+11

Es ist legal, es ist tragbar. Und ich ermutige es. :) – augustss

+0

Mehrere Platzhalter-IDs für Klarheit zu haben ist meiner Meinung nach eine gute Idee, aber wenn sie nicht vor "Definiert, aber nicht benutzt" warnen, sollten sie nicht * erlaubt * sein! –

+0

@TomEllis Bezeichner wie '_thisOne' dürfen verwendet werden. Sie dürfen auch ignoriert werden. –

Antwort

24

Ja. In section 2.4 of the 2010 specification, heißt es

Unders, _, als Kleinbuchstaben behandelt wird, und kann überall dort, wo ein Kleinbuchstabe kann auftreten.

... also _threadId ist ein legaler Bezeichner entsprechend der Sprachspezifikation, die absolut portabel sein sollte.

Jedoch ist _ selbst eine reservierte Kennung, die als Platzhalter in Mustern verwendet wird.

... so kann man nicht _ allein außerhalb Muster, verwenden also kann nicht diesen Wert verwenden.

Compiler, die Warnungen für nicht verwendete Bezeichner anbieten, sollten solche Warnungen für Bezeichner, die mit Unterstrichen beginnen, unterdrücken. Dies ermöglicht Programmierern, _foo für einen Parameter zu verwenden, von dem sie erwarten, dass sie nicht verwendet werden.

So _threadId ist eine gewöhnliche Kennung, die Sie könnten Einsatz an anderer Stelle, aber man sollte nicht gewarnt werden, wenn Sie es wegwerfen.

(Genau der gleiche Text ist in dem Bericht 98 Haskell.)


Beispiele:

main = do 
    _two <- return 2 
    print _two  -- works 

compiliert und druckt 2 gemäß der Spezifikation und

main = do 
    _two <- return 2 
    print 3   -- no warnings, but oops, didn't use _two 

compiliert ohne Warnung gemäß der Spezifikation und

main = do 
    _ <- return 2 
    print _  -- syntax error: _ used as identifier 

ist ein Syntaxfehler gemäß der Spezifikation.

+1

ist das '_' in' _ <- return 2' kein Muster? Ich denke '... <- ... ist ein Mustervergleich; Wenn es fehlschlägt, wird das 'fail' der' Monad'-Instanz aufgerufen. – GarethR

+1

@GarethR Ja, '_' ist ein Muster, der Syntaxfehler liegt in der nächsten Zeile, wenn Sie versuchen, ihn als Bezeichner zu verwenden. Ich habe meine Antwort aktualisiert, um sie klarer zu machen, also danke für die Frage. –