在比如Haskell,Purescript和榆树语言也可以是强大的思考的类型,集,描述here。这个工具可以帮助你选择哪一个数据结构最适合您的问题。它还允许您分析多少国家不可能有。
是否有可能采取这个想法,并转移到程序OOP语言,如Java,分析如果不可能状态是不可能的?如果是这样,怎么会看起来?
编辑:类型基数为我们提供了可能值的类型可以表示的数量。在FP,比较好的做法是根据数据类型的模型。通过计算基数那么我们可以检查是否有可能对我们的计划表示无效数据。如果数据结构的基数是不是可能的数据量高/规定应该保持,数据结构允许我们代表无效数据。
与此不同,OOP。在OOP中,我们不经过类型,而是包含代表现实世界中的属性和方法的对象后建模。是否有OOP我们可以分析对象的可能实例的数量,以检查该对象是否可以包含无效数据以类似的方式?我怀疑对象可能是过于笼统,不能进行这样的分析。
你能翻译这些概念OOP像(我想)语言Java或C#。一些概念有相当冗长的翻译,但是我介绍其中的一部分here。
产品类型只是你的正常Value Objects。点心种类较多棘手。
考虑从Height
的the page linked to in the OP类型。您可以在C#这样的Church encode它:
public interface IHeight
{
T Match<T>(Func<int, T> inches, Func<float, T> meters);
}
这也需要实现此接口的两个类。
事实证明,和类型的教会编码equivalent to the Visitor design pattern,所以你也可以定义高度和类型的观众:
public interface IHeight
{
T Accept<T>(IHeightVisitor<T> visitor);
}
其中IHeightVisitor<T>
看起来是这样的:
public interface IHeightVisitor<T>
{
T VisitInches(int inches);
T VisitMeters(float meters);
}
一个IHeight
的实现应该是这样:
public sealed class Inches : IHeight
{
private readonly int inches;
public Inches(int inches)
{
this.inches = inches;
}
public T Accept<T>(IHeightVisitor<T> visitor)
{
return visitor.VisitInches(inches);
}
}
您还需要另一种实现方式中,Meters
类,但我会离开,作为一个练习(提示:它看起来很像Inches
)。
需要明确的是,类似的IHeight
界面真的应该是一个实现细节。然而在这里,我用它来“证明我的工作”。你或许应该封装实施,使没有人获取有关实现该接口可笑的想法。这里的an example of how you might do that with Either。