F#:实现“ try cast”功能,参数化“ subtype of”约束不起作用

Raf*_*eis 5 c# f# c#-to-f#

我正在尝试在F#中实现“尝试转换”运算符。约束的子类型不起作用。

例如,我想在C#中做的事情:

static A TryCast<TSuper, TSub, A>(
    Func<TSub, A> f,
    Func<TSuper, A> g,
    TSuper x)
    where TSub : TSuper
    =>
    x is TSub sub ? f(sub) : g(x);
Run Code Online (Sandbox Code Playgroud)

F#中的等效项应为:

let tryCast<'super, 'sub when 'sub :> 'super>
    (f : 'sub -> 'a) (g: 'super -> 'a) (x : 'super) : 'a =
        match x with
        | :? 'sub as sub -> f sub
        | x              -> g x
Run Code Online (Sandbox Code Playgroud)

要么

... 
if x :? 'sub then f (x :?> 'sub) else g x
Run Code Online (Sandbox Code Playgroud)

但是,它给我一个错误:“何时”子句中的“ sub已被限制为始终为“ super”。这似乎表明F#不支持此功能。我觉得可以用C#做​​到这一点很奇怪。

所以问题是:这可以在F#中完成吗?