我发现以下 C# 扩展方法非常有用:
public static bool In<T>(this T x, params T[] xs)
{
return xs.Contains(x);
}
允许 C# 调用,例如
var s = "something else";
var rslt = s.In("this","that","other") ? "Yay" : "Boo";
和
var i = 1;
var rslt = i.In(1,2,3) ? "Yay" : "Boo";
我一直在尝试提出一个 F#(接近)等效项,例如:
let s = "something else"
let rslt = if s.In("this","that","other") then "Yay" else "Boo"
看来我需要类似的东西:
type 'T with
static member this.In([ParamArray] xs : 'T )
{
return xs.Contains(x);
}
但这不是合法的 F# 语法。我看不到如何在 F# 中的泛型类上声明扩展方法。可能吗?或者有没有更好的方法来实现类似的结果?(我想我可以在 C# 项目中链接并从 F# 调用它,但那将是作弊!:-)
我能想到的最好的办法是:
let inline In (x : 'a, [<ParamArray>] xs : 'a[]) = Array.Exists( xs, (fun y -> x = y) )
我希望允许这样的电话(无论如何,这不是真的可以接受的):
if In(ch, '?', '/') then "Yay" else "Boo"
但实际上需要:
if In(ch, [| '?'; '/' |]) then "Yay" else "Boo"
暗示 ParamArray 属性被忽略(出于我尚未理解的原因)。