F# 如何定义和使用带有不可推断类型参数的活动模式?

F# 如何定义和使用带有不可推断类型参数的活动模式?,f#,F#,我尝试了以下方法: 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

我尝试了以下方法:

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

活动模式是否可能具有显式类型参数?如果是这样的话,我该如何定义和使用它们呢?

我不确定是否有一种干净的方法可以做到这一点(可能没有,但我可能错了)

作为一种肮脏的解决方法,您可以添加一个类型为
'T
(在使用易于创建值的基本类型时)或类型为
Expr的伪参数,然后添加一些(box((unbox y)))
没有别的
让我们来看看
|OpAdd res->res
|->null

我认为没有任何方法可以做你想做的事情,因为我认为这没有什么意义。当使用活动模式时,编译器将如何推断类型参数

也就是说

function
| OpAdd x -> ...
编译器如何知道
'a
应该是什么

在我看来,你有两个选择。一种是在模式的返回类型中反映
'a

let inline (|OpAdd|_|) (aty:System.Type, x:obj, y:obj) =
    if aty.Equals(typeof<'a>) then Some((unbox<'a> x + unbox<'a> y) : 'a)
    else None

let (OpAdd(x:int)) = typeof<int>, box 1, box 2
let (OpAdd(y:float)) = typeof<float>, box 3.0, box 4.0
let inline(|OpAdd | | |)(aty:System.Type,x:obj,y:obj)=

如果aty.Equals(typeof x+unboxI)假设您可能想编写
函数| OpAdd x->…
,但这(目前)在语法上是无效的。@kvb-当我实际使用您的方法使返回类型通用(以及稍后的装箱)时,我给@Tomas打了一个复选标记,因为当您没有这样的奢侈时,他的解决方案更通用。
function
| OpAdd x -> ...
let inline (|OpAdd|_|) (aty:System.Type, x:obj, y:obj) =
    if aty.Equals(typeof<'a>) then Some((unbox<'a> x + unbox<'a> y) : 'a)
    else None

let (OpAdd(x:int)) = typeof<int>, box 1, box 2
let (OpAdd(y:float)) = typeof<float>, box 3.0, box 4.0