2010-11-01 15 views
5

Przeczytałem wszystkie stopnie dotyczące ograniczenia wartości w F #, ale nadal nie rozumiem tego. Mam następujący kod:Ograniczenie wartości 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)] 

i kompilator pokazuje błąd:

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. 

Czy ktoś może mi pomóc? Dziękuję bardzo;)

+2

Czy możesz podać kod wywołujący spłaszczyć? Mogę skompilować i uruchomić tę próbkę tylko dobrze – JaredPar

+0

, ale kiedy dzwonię spłaszczam Nill ;; tam jest problem. – 877

Odpowiedz

11

Pozwól mi użyć moich umiejętności psychicznego debugowania. Nie można wywołać flatten Nil, ponieważ, jak wskazuje kompilator, wynikiem może być 'a list dla dowolnego typu 'a. Musisz dodać adnotację typu, na przykład (flatten Nil : int list).

W przypadku niepowiązanej uwagi, drugi przypadek w definicji spłaszczania jest niepotrzebny i można go usunąć, ponieważ jest również objęty trzecim przypadkiem.

+2

+1 dla PDS ..... – Daniel

+0

Jeśli chodzi o niepowiązaną notatkę "drugi przypadek w definicji spłaszczania jest niepotrzebny i można go usunąć, ponieważ jest on również objęty trzecim przypadkiem", czy wydajność mogłaby być lepsza w drugim przypadku ponieważ zmniejszy to wiele dodatkowych dopasowań? – ca9163d9

+0

@ dc7a9163d9 - tak, to na pewno możliwe. Ale domyślam się najprostszej rzeczy i wprowadzam tylko takie optymalizacje, jeśli wydajność nie spełnia celów. – kvb

Powiązane problemy