试图弄清楚如何创建一个方法列表中的方法和另一个参数。我有我在C#中创建的方法,我正在尝试将其转移到F#:
public interface IValidator
{
MethodResult Validate(IList<Func<userModel, MethodResult>> validationMethods
, userModeltoValidate);
}
我尝试过类似的事情:
type public IValidator =
abstract Validate : IList<(BasicUserModel -> MethodResult<'a>)>, BasicUserModel
-> MethodResult<'a>
但即使我用括号括起参数签名,它也不喜欢语法。最终目标是拥有一个方法,该方法接收方法列表并通过迭代列表来运行它们。
public MethodResult Validate(IList<Func<BasicUserModel, MethodResult>> validationMethods,
BasicUserModel toValidate)
{
...
}
循环部分我可以轻松使用F#,它是抽象类型和实现杀死我的方法的类型的方法签名语法。
答案 0 :(得分:1)
F#相当于
public MethodResult Validate(
IList<Func<BasicUserModel, MethodResult>> validationMethods,
BasicUserModel toValidate) {
...
}
是
member this.Validate
(validationMethods : IList<(BasicUserModel -> MethodResult)>,
toValidate : BasicUserModel) = ...
唯一的区别是F#版本需要IList
的{{1}}(更加惯用)与C#中的FSharpFunc
。
答案 1 :(得分:1)
在抽象方法声明中,不是用逗号分隔参数类型,而应该用星号分隔,就像方法采用元组一样:
abstract Validate : IList<(BasicUserModel -> MethodResult<'a>)> * BasicUserModel
-> MethodResult<'a>
以下是其他一些想法:
public
关键字。seq<_>
而不是IList<_>
会更加惯用(并且对于来电者更灵活)。MethodResult<'a>
返回'a
)。如果要在泛型类型上使用非泛型方法,请将'a
参数添加到类型声明中:type IValidator<'a> = ...
。