我正在尝试在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 …Run Code Online (Sandbox Code Playgroud)