2010-11-01 13 views
5

Ho letto tutte le impronte sulla restrizione del valore in F #, ma ancora non lo capisco. Ho il seguente codice:Limitazione valore F #

type tree<'a> = 
    | Nil 
    | Node of (tree<'a> * 'a * tree<'a>) 

let rec flatten = function 
    | Nil -> [] 
    | Node (Nil, b, Nil) -> [b] 
    | Node (l, h, p) -> List.concat [(flatten l);[h];(flatten p)] 

e il compilatore mostrare un errore:

error FS0030: Value restriction. The value 'it' has been inferred to have generic type 
    val it : '_a list  
Either define 'it' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. 

Qualcuno mi può aiutare? Grazie mille;)

+2

È possibile fornire un appiattimento del codice? Posso compilare ed eseguire questo esempio semplicemente – JaredPar

+0

ma quando chiamo Nill appiattito ;; c'è un problema. – 877

risposta

11

Consentitemi di usare le mie abilità di debug psichico. Non è possibile chiamare flatten Nil perché, come indica il compilatore, il risultato potrebbe essere un 'a list per qualsiasi tipo 'a. È necessario aggiungere un'annotazione di tipo, ad esempio (flatten Nil : int list).

Su una nota non correlata, il secondo caso nella definizione di appiattimento non è necessario e può essere rimosso poiché è anche coperto dal terzo caso.

+2

+1 per PDS ..... – Daniel

+0

Per quanto riguarda la nota non correlata di "secondo caso nella definizione di appiattimento non è necessario e può essere rimosso poiché è anche coperto dal terzo caso", potrebbe la prestazione essere migliore con il secondo caso dal momento che ridurrà molte partite extra? – ca9163d9

+0

@ dc7a9163d9 - sì, questo è certamente possibile. Ma per impostazione predefinita è la cosa più semplice e introdurre solo tali ottimizzazioni se le prestazioni non soddisfano gli obiettivi. – kvb