这个 C# class 在 F# 中是什么样子的
What does this C# class look like in F#
我有这个 C# class Project
:
public class Project
{
private readonly IList _tasks = new List<>();
public string Id { get; set; }
public int Version { get; set; }
public DateTimeOffset StartedTime { get; set; }
public string Name { get; set; }
public Project(ProjectStarted started)
{
Version = 1;
Name = started.Name;
StartedTime = started.Timestamp;
}
public void Apply(TaskRecorded recorded, IEvent e)
{
Version = e.Version;
var task = new ProjectTask
{
Title = recorded.Title,
Number = _tasks.Max(x => x.Number) + 1,
Recorded = recorded.Timestamp
};
_tasks.Add(task);
}
}
public class ProjectTask
{
public string Title { get; set; }
public int Number { get; set; }
public DateTimeOffset Recorded { get; set; }
}
public class TaskRecorded
{
public string Title { get; set; }
public DateTimeOffset Timestamp { get; set; }
}
public class ProjectStarted
{
public string Name { get; set; }
public DateTimeOffset Timestamp { get; set; }
}
这在 F# 中会是什么样子?
我正在努力使构造函数和 Apply
方法正确。
更新 - 这就是我到目前为止所做的:
type ProjectTask = {
Title: string
Number: int
Recorded: DateTimeOffset
}
type TaskRecorded = {
Title: string
Timestamp: DateTimeOffset
}
type ProjectStarted = {
Name: string
Timestamp: DateTimeOffset
}
type Project(projectStarted) =
member val Version = 1
member val Name = projectStarted.Name
member val StartedTime = projectStarted.Timestamp
member this.Apply (recorded: TaskRecorded) (event: Events.IEvent) =
Version <- event.Version
我正在尝试更改我在构造函数中创建的 属性 版本的值。
更新 2:
这就是我现在所做的:
type Project(projectStarted) =
let mutable Version:int64 = int64(1)
let mutable Tasks = []
member val Name = projectStarted.Name
member val StartedTime = projectStarted.Timestamp
member this.Apply (recorded: TaskRecorded) (event: Events.IEvent) =
Version <- event.Version
let task = { Title=recorded.Title; Number= 1;Recorded = recorded.Timestamp }
Tasks = Tasks @ [task]
不确定这是否正确。
这就是我想出的 - 如果这是正确的方法,无论如何寻找一些评论:
type ProjectTask = {
Title: string
Number: int
Recorded: DateTimeOffset
}
type TaskRecorded = {
Title: string
Timestamp: DateTimeOffset
}
type ProjectStarted = {
Name: string
Timestamp: DateTimeOffset
}
type Project(projectStarted) =
let mutable Version:int64 = int64(1)
let mutable Tasks = []
member val Name = projectStarted.Name
member val StartedTime = projectStarted.Timestamp
member this.Apply (recorded: TaskRecorded) (event: Events.IEvent) =
Version <- event.Version
let task = { Title=recorded.Title; Number= 1;Recorded = recorded.Timestamp }
Tasks = Tasks @ [task]
您已经很接近了,但是需要进行一些更改以使其与 C# 代码保持一致。使用 let
使变量在 class 的范围内时私有。您还需要 with get, set
相当于 C# 代码中的 { get; set; }
。另一件需要注意的事情是 F# 中的 list
是一个链接列表,而不是 C# 中的 List
,它是一个可调整大小的数组,所以通常你想追加到列表的前面而不是像你一样后面在 Apply
中进行。如果您想使用 C# 的 List
的等价物,您需要 ResizeArray
。我省略了 Id
成员,因为它没有在任何地方使用。您还会注意到,要访问 class 的成员(与 let 绑定变量相反),您必须使用在 this.Apply
.[=22 中命名的 this
=]
type Project(projectStarted) =
let mutable tasks = []
member val Version: int64 = 1L with get, set
member val Name = projectStarted.Name with get, set
member val StartedTime = projectStarted.Timestamp with get, set
member this.Apply (recorded: TaskRecorded) (event: Events.IEvent) =
this.Version <- event.Version
let task =
{ Title = recorded.Title
Number = 1
Recorded = recorded.Timestamp }
tasks <- tasks @ [ task ]
我有这个 C# class Project
:
public class Project
{
private readonly IList _tasks = new List<>();
public string Id { get; set; }
public int Version { get; set; }
public DateTimeOffset StartedTime { get; set; }
public string Name { get; set; }
public Project(ProjectStarted started)
{
Version = 1;
Name = started.Name;
StartedTime = started.Timestamp;
}
public void Apply(TaskRecorded recorded, IEvent e)
{
Version = e.Version;
var task = new ProjectTask
{
Title = recorded.Title,
Number = _tasks.Max(x => x.Number) + 1,
Recorded = recorded.Timestamp
};
_tasks.Add(task);
}
}
public class ProjectTask
{
public string Title { get; set; }
public int Number { get; set; }
public DateTimeOffset Recorded { get; set; }
}
public class TaskRecorded
{
public string Title { get; set; }
public DateTimeOffset Timestamp { get; set; }
}
public class ProjectStarted
{
public string Name { get; set; }
public DateTimeOffset Timestamp { get; set; }
}
这在 F# 中会是什么样子?
我正在努力使构造函数和 Apply
方法正确。
更新 - 这就是我到目前为止所做的:
type ProjectTask = {
Title: string
Number: int
Recorded: DateTimeOffset
}
type TaskRecorded = {
Title: string
Timestamp: DateTimeOffset
}
type ProjectStarted = {
Name: string
Timestamp: DateTimeOffset
}
type Project(projectStarted) =
member val Version = 1
member val Name = projectStarted.Name
member val StartedTime = projectStarted.Timestamp
member this.Apply (recorded: TaskRecorded) (event: Events.IEvent) =
Version <- event.Version
我正在尝试更改我在构造函数中创建的 属性 版本的值。
更新 2:
这就是我现在所做的:
type Project(projectStarted) =
let mutable Version:int64 = int64(1)
let mutable Tasks = []
member val Name = projectStarted.Name
member val StartedTime = projectStarted.Timestamp
member this.Apply (recorded: TaskRecorded) (event: Events.IEvent) =
Version <- event.Version
let task = { Title=recorded.Title; Number= 1;Recorded = recorded.Timestamp }
Tasks = Tasks @ [task]
不确定这是否正确。
这就是我想出的 - 如果这是正确的方法,无论如何寻找一些评论:
type ProjectTask = {
Title: string
Number: int
Recorded: DateTimeOffset
}
type TaskRecorded = {
Title: string
Timestamp: DateTimeOffset
}
type ProjectStarted = {
Name: string
Timestamp: DateTimeOffset
}
type Project(projectStarted) =
let mutable Version:int64 = int64(1)
let mutable Tasks = []
member val Name = projectStarted.Name
member val StartedTime = projectStarted.Timestamp
member this.Apply (recorded: TaskRecorded) (event: Events.IEvent) =
Version <- event.Version
let task = { Title=recorded.Title; Number= 1;Recorded = recorded.Timestamp }
Tasks = Tasks @ [task]
您已经很接近了,但是需要进行一些更改以使其与 C# 代码保持一致。使用 let
使变量在 class 的范围内时私有。您还需要 with get, set
相当于 C# 代码中的 { get; set; }
。另一件需要注意的事情是 F# 中的 list
是一个链接列表,而不是 C# 中的 List
,它是一个可调整大小的数组,所以通常你想追加到列表的前面而不是像你一样后面在 Apply
中进行。如果您想使用 C# 的 List
的等价物,您需要 ResizeArray
。我省略了 Id
成员,因为它没有在任何地方使用。您还会注意到,要访问 class 的成员(与 let 绑定变量相反),您必须使用在 this.Apply
.[=22 中命名的 this
=]
type Project(projectStarted) =
let mutable tasks = []
member val Version: int64 = 1L with get, set
member val Name = projectStarted.Name with get, set
member val StartedTime = projectStarted.Timestamp with get, set
member this.Apply (recorded: TaskRecorded) (event: Events.IEvent) =
this.Version <- event.Version
let task =
{ Title = recorded.Title
Number = 1
Recorded = recorded.Timestamp }
tasks <- tasks @ [ task ]