在 f# 中使用 IRepository 接口
Using IRepository interfaces in f#
我目前正在将一个用 c# 编写的研究生项目重写为 f#。
我对如何在 f# 中处理 IRepository 接口感到困惑。这在 c# 中似乎微不足道,但 f# 不喜欢我所做的。
有问题的 IRepository 在 myNameSpace.SolarSystem 名称 space 中定义。我确保将其包含在我的 f# 项目中。
这是我的笔记:
f# - 接口类型的无效使用 <--(let repo = IRepository<SolarSystem>()
)
open myNameSpace.SolarSystem
let searchCatalog = [| 8; 11; 31 |]
let repo = IRepository<SolarSystem>()
let ClassOfSolarSystems classOfStar =
repo.Query().Where(fun s -> s.SolarGroups.Any(fun c -> searchCatalog.Contains(classOfStar) ))
c# - 没有错误:
using myNameSpace.SolarSystem
private readonly int[] searchCatalog = new int[] { 8, 11, 31 };
public IRepository<SolarSystem> Repo { get; set; }
public IEnumerable<SolarSystem> ClassOfSolarSystems(Int32 classOfStar)
{
return Repo.Query()
.Where(s => s.SolarGroups.Any(c => searchCatalog.Contains(classOfStar)));
}
我用尽了我的 googlefu,找不到任何有意义的(至少对我而言)解决方案。
有没有办法在 f# 中使用 IRepository 接口?
谢谢!
您的 F# 行等效于此 C#,因为关键字 new
隐含在 F# 中。
var repo = new IRepository<SolarSystem>()
C# 编译器也不会让您这样做。此外,您的 C# 示例是 属性,而在 F# 中它是一个值绑定。 To define properties in F# you need to use the member
keyword.
编辑
我和编辑器玩了一会儿,直到我发现编译器有点满意的东西,想出了这个。
let ClassOfSolarSystems (repo : IRepository<SolarSystem>) classOfStar =
repo.Query()
|> Seq.filter(fun s -> s.SolarGroups.Any(fun c -> searchCatalog.Contains(classOfStar) ))
我并没有把你的 LINQ 表达式搞得一团糟,但你应该考虑改用 F# Seq
module。
写的时候
let repo = IRepository<SolarSystem>()
您尝试创建接口的实例,如您所知,这是不可能的。
只需创建一个带有存储库和搜索参数的函数。
open SolarSystems
open System.Linq
type RepositoryFunctions =
member this.ClassOfSolarSystems (repo:IRepository<SolarSystem>) (classOfStar:int32) =
repo.Query().Where(fun s -> s.SolarGroups.Any(fun c -> searchCatalog.Contains(classOfStar) ))
所以,如果你不喜欢在 F# 中使用 LINQ,你可以这样写:
open SolarSystems
type RepositoryFunctions =
member this.ClassOfSolarSystems (repo:IRepository<SolarSystem>) (classOfStar:int32) =
let catalogContainsStar searchCatalog = searchCatalog.Contains(classOfStar)
let systemContainsStar solarSys = solarSys.SolarGroups.Any( catalogContainsStar )
let getAllWithStar = Seq.filter systemContainsStar
in
repo.Query() |> getAllWithStar
我目前正在将一个用 c# 编写的研究生项目重写为 f#。
我对如何在 f# 中处理 IRepository 接口感到困惑。这在 c# 中似乎微不足道,但 f# 不喜欢我所做的。
有问题的 IRepository 在 myNameSpace.SolarSystem 名称 space 中定义。我确保将其包含在我的 f# 项目中。
这是我的笔记:
f# - 接口类型的无效使用 <--(let repo = IRepository<SolarSystem>()
)
open myNameSpace.SolarSystem
let searchCatalog = [| 8; 11; 31 |]
let repo = IRepository<SolarSystem>()
let ClassOfSolarSystems classOfStar =
repo.Query().Where(fun s -> s.SolarGroups.Any(fun c -> searchCatalog.Contains(classOfStar) ))
c# - 没有错误:
using myNameSpace.SolarSystem
private readonly int[] searchCatalog = new int[] { 8, 11, 31 };
public IRepository<SolarSystem> Repo { get; set; }
public IEnumerable<SolarSystem> ClassOfSolarSystems(Int32 classOfStar)
{
return Repo.Query()
.Where(s => s.SolarGroups.Any(c => searchCatalog.Contains(classOfStar)));
}
我用尽了我的 googlefu,找不到任何有意义的(至少对我而言)解决方案。
有没有办法在 f# 中使用 IRepository 接口?
谢谢!
您的 F# 行等效于此 C#,因为关键字 new
隐含在 F# 中。
var repo = new IRepository<SolarSystem>()
C# 编译器也不会让您这样做。此外,您的 C# 示例是 属性,而在 F# 中它是一个值绑定。 To define properties in F# you need to use the member
keyword.
我和编辑器玩了一会儿,直到我发现编译器有点满意的东西,想出了这个。
let ClassOfSolarSystems (repo : IRepository<SolarSystem>) classOfStar =
repo.Query()
|> Seq.filter(fun s -> s.SolarGroups.Any(fun c -> searchCatalog.Contains(classOfStar) ))
我并没有把你的 LINQ 表达式搞得一团糟,但你应该考虑改用 F# Seq
module。
写的时候
let repo = IRepository<SolarSystem>()
您尝试创建接口的实例,如您所知,这是不可能的。
只需创建一个带有存储库和搜索参数的函数。
open SolarSystems
open System.Linq
type RepositoryFunctions =
member this.ClassOfSolarSystems (repo:IRepository<SolarSystem>) (classOfStar:int32) =
repo.Query().Where(fun s -> s.SolarGroups.Any(fun c -> searchCatalog.Contains(classOfStar) ))
所以,如果你不喜欢在 F# 中使用 LINQ,你可以这样写:
open SolarSystems
type RepositoryFunctions =
member this.ClassOfSolarSystems (repo:IRepository<SolarSystem>) (classOfStar:int32) =
let catalogContainsStar searchCatalog = searchCatalog.Contains(classOfStar)
let systemContainsStar solarSys = solarSys.SolarGroups.Any( catalogContainsStar )
let getAllWithStar = Seq.filter systemContainsStar
in
repo.Query() |> getAllWithStar