Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java/OOP中类型的基数分析_Java_Oop_Haskell_Functional Programming_Type Theory - Fatal编程技术网

Java/OOP中类型的基数分析

Java/OOP中类型的基数分析,java,oop,haskell,functional-programming,type-theory,Java,Oop,Haskell,Functional Programming,Type Theory,在Haskell、Purescript和Elm等语言中,将类型视为集合是非常强大的,如所述。此工具可帮助您选择最适合您的问题的数据结构。它还允许您分析有多少不可能的状态 有没有可能将这个想法转化为过程OOP语言,比如Java,来分析不可能状态是否是不可能的?如果是,那会是什么样子 编辑:类型的基数为我们提供了一个类型可以表示的可能值的数量。在FP中,良好的实践是根据数据对类型进行建模。通过计算基数,我们可以检查我们的程序是否可能表示无效数据。如果数据结构的基数高于它应该持有的可能数据/状态的数量

在Haskell、Purescript和Elm等语言中,将类型视为集合是非常强大的,如所述。此工具可帮助您选择最适合您的问题的数据结构。它还允许您分析有多少不可能的状态

有没有可能将这个想法转化为过程OOP语言,比如Java,来分析不可能状态是否是不可能的?如果是,那会是什么样子

编辑:类型的基数为我们提供了一个类型可以表示的可能值的数量。在FP中,良好的实践是根据数据对类型进行建模。通过计算基数,我们可以检查我们的程序是否可能表示无效数据。如果数据结构的基数高于它应该持有的可能数据/状态的数量,那么数据结构允许我们表示无效数据


将此与OOP进行对比。在OOP中,我们不在类型之后建模,而是在包含表示真实世界的属性和方法的对象之后建模。在OOP中是否有类似的方法可以分析对象的可能实例数量,以检查该对象是否包含无效数据?我怀疑对象可能过于笼统,无法进行此类分析。

您可以将这些概念转换为面向对象语言,如(我想)Java或C。有些概念有相当详细的翻译,但我会介绍其中的一些

产品类型正是你的常态。求和类型更复杂

考虑来自的
Height
类型。你可以用C#这样写:

public interface IHeight
{
    T Match<T>(Func<int, T> inches, Func<float, T> meters);
}
public interface IHeightVisitor<T>
{
    T VisitInches(int inches);

    T VisitMeters(float meters);
}
您还需要另一个实现,
Meters
类,但我将把它留作练习(提示:它看起来很像
Inches


需要明确的是,像IHeight这样的接口应该是一个实现细节。然而,在这里,我用它来“展示我的作品”。您可能应该封装实现,这样就不会有人对实现该接口产生有趣的想法。以下是。

就类型而言,类是一种产品类型(围绕产品的包装),组成类型是类的属性类型。然而,除非您大量使用枚举类型,否则基数对您没有多大帮助。像
int
string
这样的内置类型具有无限的基数(无论如何,这是有效的;如果使用这种技术,知道
int
的基数约为40亿将不会非常有用。)
public interface IHeightVisitor<T>
{
    T VisitInches(int inches);

    T VisitMeters(float meters);
}
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);
    }
}