2010-11-01 16 views
5

F # değer kısıtlamasıyla ilgili tüm basamakları okudum, ancak hala anlamadım.F # değer kısıtlaması

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. 

Herkes bana yardımcı olabilir: bir hata gösterebilir

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)] 

ve derleyici: Aşağıdaki kod var? Çok teşekkür ederim;)

+2

Kod çağrılarını düzleştirmeyi sağlayabilir misiniz? Ben sadece bu örnek derlemek ve ince – JaredPar

+0

çalıştırabilirsiniz ama ben düz Nill çağırdığınızda ;; Bir sorun var. PDS için – 877

cevap

11

Psişik hata ayıklama becerilerimi kullanmama izin verin. flatten Nil'u arayamazsınız çünkü derleyici belirtildiği gibi, sonuç 'a türünde bir 'a list olabilir. (flatten Nil : int list) gibi bir tür not eklemeniz gerekir.

İlişik olmayan bir notta, düzleştirmenin tanımındaki ikinci durumunuz gereksizdir ve üçüncü vaka tarafından da kapsandığı için kaldırılabilir.

+2

+1 ..... – Daniel

+0

"Düzleştirmenin tanımlanmasındaki ikinci durum gereksizdir ve üçüncü dava tarafından da kaplandığı için çıkarılabilir" ile ilgili olarak, ikinci durumda performans daha iyi olabilir. fazladan eşleşme sayısını azaltacağından – ca9163d9

+0

@ dc7a9163d9 - evet, kesinlikle mümkün. Ancak, en basit olanı varsayılan hale getirebilirim ve performansın hedeflere ulaşmaması durumunda bu optimizasyonları sunarım. – kvb