2012-02-23 40 views
5

Tôi có một F # Chức năng:F # giá trị giới hạn trong danh sách trống

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 

Nó loại bỏ tất cả các yếu tố tại một chỉ số thậm chí trong một danh sách. Nó hoạt động nếu tôi cung cấp cho danh sách một số imput, như removeEven ['1';'2';'3'] tôi nhận được ['1';'3'] mà tôi có nghĩa vụ phải. Nhưng khi tôi chèn một danh sách trống làm thông số, tôi nhận được lỗi này:

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.

Trợ giúp, bất kỳ ai?

Trả lời

7

Danh sách trống ([]) khá đặc biệt; nó có thể là một danh sách của bất kỳ loại nào. Do đó, trình biên dịch phàn nàn rằng bạn không có loại cụ thể cho []. Thêm chú thích kiểu trên lập luận giúp giải quyết vấn đề:

let results = removeEven ([]: int list) 

hoặc gõ chú thích nhiều thành ngữ theo đề nghị của @kvb:

let results: int list = removeEven [] 

Đây có lẽ là vượt ra ngoài câu hỏi, nhưng chức năng của bạn nên được đặt tên là removeOdd vì chỉ mục thường bắt đầu từ 0 và chức năng của bạn sẽ xóa tất cả các thành phần có chỉ mục lẻ. Hơn nữa, mọi thứ được nhiều hơn nữa rõ ràng nếu bạn sử dụng mô hình kết hợp hai yếu tố đầu tiên của danh sách hơn là giữ một bộ đếm x cho chỉ số kiểm tra:

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

Lưu ý rằng bạn cũng có thể thêm chú thích trực tiếp cho 'results' thay vào đó, có thể thành ngữ hơn. – kvb

+0

Hàm removeOdd được đề xuất không thành công khi đối số là '[]'. Tôi đang cố giải quyết vấn đề này theo cách chung chung, nhưng tôi không thể quản lý để xử lý lỗi '[]' không có lỗi "FS0030: Giới hạn giá trị". Có thể thực hiện chức năng như vậy thật sự chung chung không? – TurboHz

Các vấn đề liên quan