8

Tôi đang cố gắng để tạo ra phương pháp khuyến nông khác nhau cho một loại generic ràng buộc để các tham số kiểu generic cụ trong F #, nhưng ngôn ngữ dường như không được cho phép tôi:phương pháp mở rộng với nhiều loại generic cụ

Những gì tôi muốn làm là một cái gì đó như sau:

type IEnumerable<int> with 
    member this.foo = 
     this.ToString() 

Tuy nhiên, nó mang lại cho tôi những lỗi biên dịch (gạch chân các từ khóa int):

Số nhận dạng không mong muốn trong tên loại. Toán tử infix dự kiến, biểu tượng trích dẫn hoặc mã thông báo khác.

Sau đây không làm việc, mặc dù nó không đặc biệt ràng buộc tham số kiểu chung để int, như tôi muốn:

type IEnumerable<'a> with 
    member this.foo = 
     this.ToString() 

Có cách nào để đạt được mục tiêu này trong F # - Tôi là có lẽ chỉ sử dụng cú pháp sai? Nếu không, tôi sẽ đánh giá cao nếu có ai đó có thể đề xuất một cách giải quyết khác, có lẽ sử dụng loại ràng buộc ở đâu đó.

Trả lời

7

này là không thể trong phiên bản hiện tại của F #, không may. Xem câu hỏi liên quan here.

+0

Dường như bạn thực sự là chính xác. Dù sao cũng cảm ơn bạn. – Noldorin

+0

Tính năng này được theo dõi bởi một gợi ý trong cơ sở dữ liệu lỗi F # nội bộ "4548: Hỗ trợ các phương pháp mở rộng cho các loại instantiations cụ thể" nhưng không chắc sẽ được thực hiện cắt cho bản phát hành VS2010. – Brian

0

Vâng, bạn có thể sử dụng các ràng buộc - nhưng không phải với các loại niêm phong như int.

type IEnumerable<'a when 'a :> InheritableType> = 
member this.Blah = 
    this.ToString() 

Hmm ...

+1

Cảm ơn đề xuất, nhưng thực sự, tôi đang làm việc với loại niêm phong ở đây, vì vậy nó không hoạt động. – Noldorin

+0

Điều này có thể không làm những gì bạn nghĩ ... Bạn đang thực sự xác định một loại 'IEnumerable' mới - thử gọi phần mở rộng trên một 'IEnumerable ' hiện có. – kvb

6

phương pháp khuyến nông Generic là bây giờ đã có trong F # 3.1:

open System.Runtime.CompilerServices 
open System.Collections.Generic 

[<Extension>] 
type Utils() = 
    [<Extension>] 
    static member inline Abc(obj: IEnumerable<int>) = obj.ToString() 

printfn "%A" ([1..10].Abc()) 
0

Nhằm giúp người khác tìm kiếm giải pháp tương tự, đây là một ví dụ cho thấy làm thế nào để sử dụng phương pháp khuyến nông chung với các ràng buộc kiểu. Trong ví dụ dưới đây, có một ràng buộc kiểu yêu cầu đối số kiểu được truyền cho thấy một hàm tạo mặc định. Điều này được thực hiện bằng cách sử dụng thuộc tính [<CLIMutable>] được áp dụng cho bản ghi Order. Ngoài ra, tôi đang hạn chế kết quả của phương thức đối với loại được truyền.

Để sử dụng phương pháp mở rộng, bạn phải chỉ định loại bạn muốn sử dụng. Lưu ý rằng tôi cũng đang mở rộng giao diện từ điển chung.

[<Extension>] 
type ExtensionMethds() = 

    [<Extension>] 
    static member inline toObject<'T when 'T: (new: unit -> 'T)> (dic: IDictionary<string,obj>): 'T = 
     let instance = new 'T() 
     // todo: set properties via reflection using the dictionary passed in 
     instance 


[<CLIMutable>] 
type Order = {id: int} 

let usage = 
    let dictionaryWithDataFromDb = dict ["id","1" :> obj] 
    let theOrder = dictionaryWithDataFromDb.toObject<Order>() 
    theOrder 
Các vấn đề liên quan