Распространение необязательных аргументов

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

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

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

Ответ 1

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"
    

Ответ 2

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

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)