需要帮助将带有泛型的接口转换为来自C#的F#

Jam*_*xon 2 f#

我有这个C#代码

public interface IDinnerRepository : IRepository<Dinner>
{
    IQueryable<Dinner> FindByLocation(float latitude, float longitude);
    IQueryable<Dinner> FindUpcomingDinners();
    IQueryable<Dinner> FindDinnersByText(string q);
    void DeleteRsvp(RSVP rsvp);
}
Run Code Online (Sandbox Code Playgroud)

public interface IRepository<T>
{
    IQueryable<T> All { get; }
    IQueryable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties);
    T Find(int id);
    void InsertOrUpdate(T dinner);
    void Delete(int id);
    void SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)

我想翻译成F#.如何创建泛型界面?F#接口的MSDN示例实际上没有等价物.据我所知.

Tom*_*cek 5

实际上有两种方法可以定义泛型接口,但几乎所有F#代码都使用您在现有答案中提到的样式.另一种选择是只用于一些标准的F#类型,如'T option'T list:

type IRepository<'T> = // The standard way of doing things
type 'T IRepository =  // Used rarely for some standard F# types
Run Code Online (Sandbox Code Playgroud)

至于您的示例界面中出现的其他成员类型,其中一些实际上有点有趣,所以这里有一个更完整的翻译(仅供将来参考!)

// We inherit from this type later, so I moved it to an earlier location in the file
type IRepository<'T> =
  // Read-only properties are easier to define in F#
  abstract All : IQueryable<'T>
  // Annotating parameter with the 'params' attribute and also specifying param name
  abstract AllIncluding 
    : [<ParamArray>] includeProperties:Expression<Func<'T, obj>>[] -> IQueryable<'T>


type IDinnerRepository =
  // Inherit from another interface
  inherit IRepository<Dinner>

  // And add a bunch of other members (here I did not specify parameter names)
  abstract FindUpcomingDinners : unit -> IQueryable<Dinner>
  abstract FindDinnersByText : string -> IQueryable<Dinner>
Run Code Online (Sandbox Code Playgroud)