以下代码无法编译。
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
。
假设我的假设已被正确假设,是否有解决方法?是否可以传播可选参数?
答案 0 :(得分:24)
F#规范8.13.5方法成员的可选参数
调用者可以使用以下技术指定可选参数的值:
使用与位置匹配的普通,未命名参数。
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"
答案 1 :(得分:0)
抱歉,必须先测试一下:看来你是对的 - 你必须做“?”为了你自己:
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)
答案 2 :(得分:-1)
F# 会将 ? 标记的参数转换为可选值。 提供一个参数给出一个 Some-value 而不提供它给出一个 None-value。 可选参数和命名参数的组合让您拥有巨大的灵活性。
另见我的回答https://stackoverflow.com/a/66043023/15143713 /JEE,夏普#Soft