传播可选参数
Posted
技术标签:
【中文标题】传播可选参数【英文标题】:Propagating optional arguments 【发布时间】:2011-10-29 01:34:30 【问题描述】:以下代码无法编译。
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】:抱歉,必须先进行测试:看来您是对的 - 您必须执行“?”为你自己:
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)
【讨论】:
这是可行的。谢谢。我会等着看是否有人可以建议如何使其工作,同时保留A
上的可选参数。
再想一想,这意味着无法传播可选参数。您不能将具有相同可选参数的方法或派生类传递给构造函数——有点限制。每次都需要分支到正确的构造函数重载。
可能是一个错误 - 在类型 arg(带有?)中是字符串选项,但在 new 的定义中它是字符串 - 也许我们应该提交案例?【参考方案2】:
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"
【讨论】:
好的。你已经阅读了太多的规范。 :-) 为什么会这样? 没关系。我在规范中找到了它。我真的要读一段时间了。 有趣的是,两个月前我有一个类似的问题 (***.com/questions/6353897/…),但没有人能给我正确的答案。感谢 desco 的回答!【参考方案3】:F# 会将 ? 标记的参数转换为可选值。 提供一个参数会给出一个 Some-value,而不提供它会给出一个 None-value。 可选参数和命名参数的组合让您拥有极大的灵活性。
也可以在这里查看我的回答https://***.com/a/66043023/15143713 /JEE,夏普#Soft
【讨论】:
问题是关于如何将可选参数传播到基类。您只是指出了问题中已经说明的一些内容(翻译为 Some/None)。 请看我的链接。我确实解释了如何在那里传播可选参数。我不想重复我的答案两次。 /JEE - 锋利和柔软以上是关于传播可选参数的主要内容,如果未能解决你的问题,请参考以下文章