2010-11-01 5 views
5

He leído todas las pistas sobre la restricción de valores en F #, pero todavía no lo entiendo. Tengo el siguiente código:Restricción del valor 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)] 

y el compilador mostrará un error:

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. 

¿Puede alguien ayudarme? Muchas gracias;)

+2

¿Puede proporcionar el llamado de código aplanado? Puedo compilar y ejecutar esta muestra muy bien – JaredPar

+0

pero cuando llamo aplanar Nill ;; Hay un problema. – 877

Respuesta

11

Permítanme usar mis habilidades de depuración psíquica. No puede llamar al flatten Nil porque, como indica el compilador, el resultado podría ser 'a list para cualquier tipo 'a. Debe agregar una anotación de tipo, como (flatten Nil : int list).

En una nota no relacionada, su segundo caso en la definición de aplanar es innecesario y puede eliminarse ya que también está cubierto por el tercer caso.

+2

+1 para PDS ..... – Daniel

+0

En cuanto a la nota no relacionada de "segundo caso en la definición de aplanar es innecesario y puede eliminarse ya que también está cubierto por el tercer caso", ¿podría mejorar el rendimiento con el segundo caso? ya que reducirá una gran cantidad de partidos extra? – ca9163d9

+0

@ dc7a9163d9 - sí, eso es ciertamente posible. Pero prefiero lo más simple y solo introducir tales optimizaciones si el rendimiento no está cumpliendo los objetivos. – kvb

Cuestiones relacionadas