13

以下代码无法编译。

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

假设我的假设已被正确假设,是否有解决方法?是否可以传播可选参数?

4

3 回答 3

25

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"
    
于 2011-08-17T16:00:25.317 回答
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)
于 2011-08-17T15:53:11.257 回答
-1

F# 会将 ? 标记的参数转换为可选值。提供一个参数给出一个 Some-value,而不提供它给出一个 None-value。可选参数和命名参数的组合让您拥有巨大的灵活性。

另请参阅我的答案https://stackoverflow.com/a/66043023/15143713 /JEE, Sharp#Soft

于 2021-02-04T09:55:24.583 回答