2012-02-23 9 views
5

I tiene un F # función:F restricción # valor en lista vacía

let removeEven (listToGoUnder : _ list) = 
    let rec listRec list x = 
     match list with 
     | [] -> [] 
     | head::tail when (x%2 = 0) -> head :: listRec (tail) (x+1) 
     | head::tail -> listRec (tail) (x+1) 

    listRec listToGoUnder 0 

Se elimina todos los elementos en un índice incluso en una lista. Funciona si doy alguna importancia a la lista, como removeEven ['1';'2';'3'] Obtengo ['1';'3'] que se supone que debo. Pero cuando inserto una lista vacía como parámetro, obtengo este error:

stdin(78,1): 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.

¿Ayuda, alguien?

Respuesta

7

La lista vacía ([]) es bastante especial; puede ser una lista de cualquier tipo. Por lo tanto, el compilador se queja de que no tiene un tipo específico para []. Añadiendo tipo de anotación en el argumento de ayuda para resolver el problema:

let results = removeEven ([]: int list) 

o tipo de anotación más idiomática como sugiere @kvb:

let results: int list = removeEven [] 

Esto es probablemente más allá de la cuestión, pero su función debe ser nombrado como removeOdd ya que los índices a menudo comienzan desde 0 y su función elimina todos los elementos con índices impares. Por otra parte, las cosas son mucho más clara si se utiliza la coincidencia de patrones en los dos primeros elementos de la lista en lugar de mantener un contador de x para los índices de cheques:

let rec removeOdd = function 
    | [] -> [] 
    | [x] -> [x] 
    | x::_::xs -> x::removeOdd xs 
+0

Tenga en cuenta que también se puede añadir la anotación directamente a 'results' lugar, que podría ser más idiomático. – kvb

+0

La función removeOdd propuesta falla cuando el argumento es '[]'. Estoy tratando de resolver esto de forma genérica, pero no puedo manejar el '' caso sin un "error FS0030: restricción de valor". ¿Es posible hacer que tal función sea verdaderamente genérica? – TurboHz

Cuestiones relacionadas