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