2010-07-29 31 views

Trả lời

7

Thay đổi mã của bạn để

type Test() = 
    static member func (a: seq<#seq<'a>>) = 5. 

let a = [[4.]] 
Test.func(a) 

Bí quyết là loại a. Bạn cần phải rõ ràng cho phép seq bên ngoài giữ các trường hợp của seq < 'a > loại phụ của seq <' a >. Sử dụng ký hiệu # cho phép điều này.

4

Thông báo lỗi mô tả các vấn đề - trong F #, list<list<'a>> không tương thích với seq<seq<'a>>.

Chức năng upcast giúp làm được việc này, bằng cách làm cho a thành một list<seq<float>>, mà sau đó sẽ tương thích với seq<seq<float>>:

let a = [upcast [4.]] 
Test.func(a) 

Edit: Bạn có thể làm func linh hoạt hơn trong các loại nó chấp nhận. Bản gốc chỉ chấp nhận các chuỗi seq<'a>. Mặc dù list<'a> thực hiện seq<'a>, các loại không giống nhau và trình biên dịch cung cấp cho bạn một lỗi.

Tuy nhiên, bạn có thể sửa đổi func chấp nhận chuỗi của bất kỳ loại, miễn là loại mà thực hiện seq<'a>, bằng cách viết các loại bên trong như #seq:

type Test() = 
    static member func (a: seq<#seq<'a>>) = 5. 

let a = [[4.]] 
Test.func(a) // works 
+0

Và tại sao lại như vậy? Nếu bạn viết "let func (a: seq <'a seq>) = 5." sau đó nó hoạt động mà không có bất kỳ upcasting. –

+0

Tôi gặp lỗi tương tự - http://gist.github.com/497844 –

+0

Lỗi của tôi. Bạn đúng rồi. Bạn có bất cứ lời giải thích tại sao cho 'func (a: float seq) = 5.' chúng ta không phải làm upcasting và cho seq seq chúng ta phải làm điều đó? –

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