2011-08-17 3 views
10

Следующий код не компилируется.Распространение необязательных аргументов

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

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

Я принимаю это происходит потому, что должен быть обеспечен экземпляр базового типа опциона, а компилятор обрабатывает прохождение Some/None на основе синтаксиса.

Предполагая, что мое предположение было правильно принято, существует ли обходное решение для этого? Можно ли распространять необязательные аргументы?

ответ

21

F # спецификации 8.13.5 Необязательные аргументы членам метода

Вызывающие может указать значения для необязательных аргументов, используя следующие методы:

  • По названию , такие как arg2 = 1.
  • Путем распространения существующего необязательного значения по имени, такого как? arg2 = None или? arg2 = Some (3) или? arg2 = arg2. Это может быть полезно при создании одного метода, который передает необязательные аргументы другому.
  • Использование обычных, неназванных аргументов, соответствующих положению.

    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

Хорошо. Вы слишком много читали в спецификации. :-) Почему это работает? – Daniel

+0

Nevermind. Я нашел его в спецификации. Я уже давно прочитал это. – Daniel

+0

спасибо ... иногда синтаксис просто для легкого;) – Carsten

1

Извините, что пришлось сначала протестировать его: кажется, что вы правы - вам нужно сделать «?» для А сами:

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

Это работоспособным. Благодарю. Я подожду и посмотрю, сможет ли кто-нибудь предложить, как заставить его работать, сохраняя необязательные аргументы на 'A'. – Daniel

+0

С другой стороны, это означает, что необязательные аргументы не распространяются. У вас не может быть метода или производного класса с тем же опциональным аргументом, который передается конструктору - своего рода ограничение. Это потребовало бы разветвления на правильную перегрузку конструктора каждый раз. – Daniel

+0

может быть ошибкой - внутри типа arg (с?) Является строковой опцией, но в определении new это строка - может быть, мы должны записать файл? – Carsten

Смежные вопросы