2011-08-17 20 views
10

Mã sau đây không biên dịch.Tuyên truyền đối số tùy chọn

type A(?arg) = 
    member __.Arg : string option = arg 

type B(?arg) = 
    inherit A(arg) //ERROR expected type string but has type 'a option 

Tôi giả định này là bởi vì một thể hiện của các loại cơ bản của sự lựa chọn phải được cung cấp, và trình biên dịch handle qua Some/None dựa trên cú pháp.

Giả sử giả định của tôi đã được giả định chính xác, có cách giải quyết nào cho vấn đề này không? Có thể truyền bá các đối số tùy chọn không?

Trả lời

21

F # đặc tả 8.13.5 đối số tùy chọn cho các thành viên phương pháp

Người gọi có thể chỉ định giá trị cho đối số tùy chọn bằng cách sử dụng các kỹ thuật sau:

  • Theo tên , chẳng hạn như arg2 = 1.
  • Bằng cách truyền giá trị tùy chọn hiện tại theo tên, chẳng hạn như? arg2 = None hoặc? arg2 = Một số (3) hoặc? arg2 = arg2. Điều này có thể hữu ích khi xây dựng một phương thức chuyển đối số tùy chọn sang một đối số khác.
  • Bằng cách sử dụng các đối số bình thường, chưa được đặt tên phù hợp theo vị trí.

    type A(?arg) = 
        member __.Arg : string option = arg 
    
    type B(?arg) = 
        inherit A(?arg = arg) 
    
    printfn "1. %A" (B()).Arg // None 
    printfn "2. %A" (B("1")).Arg // Some "1" 
    
    printfn "3. %A" (A()).Arg // None 
    printfn "4. %A" (A("1")).Arg // Some "1" 
    
+0

OK. Bạn đã đọc quá nhiều thông số. :-) Tại sao điều này hoạt động? – Daniel

+0

Nevermind. Tôi tìm thấy nó trong spec. Tôi đã _really_ phải đọc nó một thời gian. – Daniel

+0

cảm ơn ... đôi khi cú pháp chỉ là dễ dàng;) – Carsten

1

Xin lỗi đã phải kiểm tra nó trước: có vẻ như bạn đã đúng - bạn phải làm "?" cho A tự hỏi:

type A(arg : string option) = 
    new (a) = new A(Some a) 
    new() = new A(None) 
    member __.Arg : string option = arg 

type B(?arg) = 
    inherit A(arg) 
+0

Đó là hoàn toàn khả thi. Cảm ơn. Tôi sẽ chờ xem có ai có thể gợi ý cách làm cho nó hoạt động trong khi vẫn giữ tùy chọn args trên 'A'. – Daniel

+0

Trên suy nghĩ thứ hai, điều này có nghĩa là các tùy chọn args không thể được nhân giống. Bạn không thể có một phương thức hoặc lớp dẫn xuất với cùng tham số tùy chọn được truyền cho hàm tạo - hạn chế kiểu. Nó sẽ yêu cầu phân nhánh đến quá tải xây dựng đúng mỗi lần. – Daniel

+0

có thể là một lỗi - bên trong loại arg (với?) Là chuỗi tùy chọn, nhưng trong định nghĩa của chuỗi mới của nó - có lẽ chúng ta nên nộp một trường hợp? – Carsten