Распространение необязательных аргументов - PullRequest
12 голосов
/ 17 августа 2011

Следующий код не компилируется.

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 на основе синтаксиса.

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

Ответы [ 2 ]

24 голосов
/ 17 августа 2011

F # spec 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 голосов
/ 17 августа 2011

Извините, сначала пришлось проверить это: кажется, вы правы - вы должны сделать "?"для себя:

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)
...