2012-02-23 10 views
5

Mam F # funkcję:F # ograniczenie wartość w pustej listy

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 

usuwa wszystkie elementy w równej indeksu na liście. Działa, jeśli podaję listę niektórych pędów, takich jak removeEven ['1';'2';'3'] otrzymam ['1';'3'], które powinienem. Ale kiedy wstawię pustą listę jako parametr, pojawia się ten błąd:

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.

Pomoc, komukolwiek?

Odpowiedz

7

Pusta lista ([]) jest dość wyjątkowa; może to być lista dowolnego typu. Dlatego kompilator skarży się, że nie masz określonego typu dla []. Dodawanie typu adnotacji na argumencie pomaga rozwiązać problem:

let results = removeEven ([]: int list) 

lub więcej idiomatyczne typu adnotacji jak sugeruje @kvb:

let results: int list = removeEven [] 

Jest to prawdopodobnie poza pytaniem, ale twoja funkcja powinna być nazwany jako removeOdd, ponieważ indeksy często zaczynają się od 0, a twoja funkcja usuwa wszystkie elementy z nieparzystymi indeksami. Ponadto, sprawy są znacznie bardziej jasne, jeśli używasz wzór pasujący na dwóch pierwszych elementów listy, zamiast trzymać licznik x dla indeksów sprawdzanie:

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

pamiętać, że można również dodać adnotację bezpośrednio do 'results' zamiast które mogą być bardziej idiomatyczne. – kvb

+0

Proponowana funkcja removeOdd kończy się niepowodzeniem, gdy argumentem jest '[]'. Próbuję rozwiązać to w sposób ogólny, ale nie mogę sobie poradzić z '[]' case bez "błędu FS0030: ograniczenie wartości". Czy jest możliwe, aby taka funkcja była prawdziwie ogólna? – TurboHz

Powiązane problemy