Распространение необязательных аргументов
Следующий код не компилируется.
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)