私は次のことを試してみました:推論不可能なタイプの引数を持つアクティブなパターンを定義して使用するにはどうすればよいですか?
let inline (|OpAdd|_|) (aty:Type, x:obj, y:obj) =
if aty.Equals(typeof<'a>) then Some(box ((unbox<'a> x) + (unbox<'a> y)))
else None
//FSI given signature:
//val inline (|OpAdd|_|) : Type * obj * obj -> obj option
何の警告やエラーを与えていないが、私は、コールサイトで明示的な型の引数を渡す方法を見つけ出すことはできません、'a
は常にint
と推察されていることを思われます。
私は定義の中で明示的なパラメータを配置しようとすると、私はカップルの警告とエラーが出る:
let inline (|OpAdd|_|)<'a> (aty:Type, x:obj, y:obj) =
if aty.Equals(typeof<'a>) then Some(box ((unbox<'a> x) + (unbox<'a> y)))
else None
warning FS1189: Type parameters must be placed directly adjacent to the type name, e.g. "type C<'T>", not type "C <'T>"
error FS0001: The declared type parameter 'a' cannot be used here since the type parameter cannot be resolved at compile time
は、それが可能なアクティブなパターンは、明示的な型パラメータを持っているためですか?もしそうなら、私はそれらをどのように定義して使用するのですか?
不快ですが、動作します! –