2014-06-24 16 views
6

Per me shadowing dei valori esistenti come descritto in:C'è un modo per avere avvisi per i valori di shadowing in F # in Visual Studio?

Shadowing and Nested function
immutable in F#
f# duplicate definition
FSharp for fun and profit comment

sembra andare contro la nozione di immutabilità e sicurezza tipo che fa F # così forte. Shadowing in F # funziona con different rispetto a C#. Mi ci è voluto un po 'di tempo per scoprire che un bug nel mio codice era dovuto all'ombreggiamento involontario di un nome all'interno dello stesso ambito. C'è un modo per avere avvisi del compilatore per i valori di shadowing in VS?

So che in alcuni casi può essere utile. ad esempio per Checked Aritmetics.

+2

L'ombreggiamento è utile, come indicato qui: http://infsharpmajor.wordpress.com/. Potresti voler spiegare che cosa pensi che lo shadowing sia, in quanto potrebbe essere che la tua comprensione sia disattivata, e risolvere questo problema potrebbe risolvere la tua preoccupazione. –

+0

@Goswin: Gli [F # Power Tools] (http://visualstudiogallery.msdn.microsoft.com/136b942e-9f2c-4c0b-8bac-86d774189cff) evidenzieranno i riferimenti, che possono aiutare a evitare questo tipo di bug. – Daniel

+0

@JamesBlack Ho modificato la mia domanda per essere più chiara – Goswin

risposta

3

L'ombra ha pro e contro. Anch'io ho riscontrato errori dovuti a sforzi di ombreggiamento con dita grasse. Tra l'altro, può aiutare a mantenere pulito lo spazio variabile come ha sottolineato @JoelMueller.

I bug di ombreggiamento sono fondamentalmente diversi da bug variabili mutabili. Sono della varietà typo. Sono molto più facili da analizzare: la perdita di informazioni storiche è ridotta al contesto lessicografico rispetto al contesto ambientale. Cioè, con l'ombra, puoi sempre tracciare in modo pulito il valore di un'associazione attraverso lo srotolamento dello stack mentale, mentre le mutazioni variabili creano ciò che è essenzialmente gotos (salta all'indirizzo).

In pratica, lo shadowing elimina ancora intere classi di bug. Non incontrerai alcuna "azione spettrale a distanza". In particolare, non si verificheranno problemi con le variabili catturate nelle chiusure o le variabili che vengono modificate negli ambiti nidificati rispetto all'ambito corrente.

4

Un posto che utilizzo lo shadowing è quando si risolve un parametro opzionale su un valore predefinito se non è stato fornito alcun valore.

member x.Foo(?myFlag: bool) = 
    let myFlag = defaultArg myFlag false 
    ... 

anche F # Interactive, il modo in cui è implementata la società, sarebbe più o meno completamente non-funzionale se non avessimo shadowing.