.net 根据“建模世界”;或;及;及;

.net 根据“建模世界”;或;及;及;,.net,f#,functional-programming,record,discriminated-union,.net,F#,Functional Programming,Record,Discriminated Union,托马斯用户: 我认为用“或”(又名歧视联盟)和“和”(又名记录)来模拟世界是一个非常强大的功能性技巧。有时,函数/接口也很有用,但如果我倾向于使用“或”/“和”尽可能多地使用:-) 假设我正在模拟动物的世界(开放世界假设),我如何通过使用有区别的联合、记录和有时的函数/接口来实现这一点 例如,使用,我可以使用歧视联合对它们进行分类吗 type Type = | Phyla of Phyla | Chordata of Chordata | Arthropods of Ar

托马斯用户:

我认为用“或”(又名歧视联盟)和“和”(又名记录)来模拟世界是一个非常强大的功能性技巧。有时,函数/接口也很有用,但如果我倾向于使用“或”/“和”尽可能多地使用:-)

假设我正在模拟动物的世界(开放世界假设),我如何通过使用有区别的联合、记录和有时的函数/接口来实现这一点

例如,使用,我可以使用歧视联合对它们进行分类吗

type Type =
    | Phyla of Phyla
    | Chordata of Chordata
    | Arthropods of Arthropods
    | ...

and Chordata =
    | Fish
    | Reptiles
    | Mammals
    | ...

函数式编程和面向对象编程在语言重点上有所不同。“功能”意味着对动词的关注,而“宾语”意味着对名词的关注


由于问题描述中缺少动词,您可能会遇到困难。你在评论中提到了动物王国模拟器;那世界上发生了什么事?我假设动物不会一动不动地坐着:-)

函数式编程和面向对象编程在语言的重点上有所不同。“功能”意味着对动词的关注,而“宾语”意味着对名词的关注


由于问题描述中缺少动词,您可能会遇到困难。你在评论中提到了动物王国模拟器;那世界上发生了什么事?我想这些动物不会一动不动地坐着:-)

这取决于你将如何对待它们。真空中的球形模型没有什么意义。@FyodorSoikin假设我想做一个动物王国模拟器。在我继续讨论主要问题之前,有一个次要问题:您的示例代码是自顶向下的,但实际上应该是自下而上编写的。也就是说,
Chordata
不需要以任何方式引用
类型
。因此,您应该先编写
Chordata
的定义,然后编写
Type
的定义,这样可以避免出现任何
关键字。在数据模型定义中出现
通常是一种代码味道:这有时是必要的,但通常意味着你还没有一个很好的领域表示。现在我的主要观点是:学习领域建模的最好方法就是这样做。基本上,你要求我们教你如何做好领域建模,但这不是一件容易解释的事情。它只能显示。你最好的选择可能是去读一些代码。与其问Tomas Petricek将如何建模域,为什么不阅读,特别是解析标记文件?这可能会教会你更多的东西,而不仅仅是问十几个问题。F#为了乐趣和利润,在F#中也有一些很好的领域建模指南:这取决于你将如何处理它们。真空中的球形模型没有什么意义。@FyodorSoikin假设我想做一个动物王国模拟器。在我继续讨论主要问题之前,有一个次要问题:您的示例代码是自顶向下的,但实际上应该是自下而上编写的。也就是说,
Chordata
不需要以任何方式引用
类型
。因此,您应该先编写
Chordata
的定义,然后编写
Type
的定义,这样可以避免出现任何
关键字。在数据模型定义中出现
通常是一种代码味道:这有时是必要的,但通常意味着你还没有一个很好的领域表示。现在我的主要观点是:学习领域建模的最好方法就是这样做。基本上,你要求我们教你如何做好领域建模,但这不是一件容易解释的事情。它只能显示。你最好的选择可能是去读一些代码。与其问Tomas Petricek将如何建模域,为什么不阅读,特别是解析标记文件?这可能会教给你更多的东西,而不仅仅是问十几个这样的问题。F#为了乐趣和利润,在F#中也有一些很好的领域建模指南: