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

申し訳ありませんが、最初にテストする必要がありました。Aさん自身のために:

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 に答える