繁体   English   中英

F#中的类型问题

[英]Types issue in F#

在我正在深入探索f#的过程中,我理解了很多这种强大的语言,但有些事情我仍然不太清楚。 我需要掌握的最重要的问题之一是类型。

我正在阅读的这本书非常直接,并通过直接的方法介绍了实体和主要功能。 我能开始的第一件事是类型。 它将主要类型引入列表,选项,元组等等......显然,由于功能编程和功能编程中数据一致性的诸多原因,所有这些类型都是IMMUTABLE。 好吧,直到现在没问题......

但现在我开始使用混凝土类型......

嗯...我在使用list,option,tuples,通过new运算符创建的类型以及使用type keyword创建的具体类型(对于缩写,具体类型......)进行管理时遇到问题。

所以我的问题是:如何在f#中有效地编目/区分所有类型的数据?

我可以在C#,VB.NET中创建类型之间的完美分离......在VB.NET中有一些示例,它们有值和引用类型,而在C#中只有引用和int,double被视为对象(它们是对象而在VB.NET中,值类型不是对象,因此在类型中存在拆分)。 在F#中,我无法在语言中的类型之间创建这种差异。 你能帮助我吗? 我希望我很清楚。

您可能在C#和VB.NET中误解了类型。 所有.NET语言的类型几乎相同; 例如,VB.NET和C#都有值类型和引用类型。

如果无法从外部更改它,任何类型都可以是不可变的。 例如,这两段代码是等价的:

// an immutable reference type in F#
type Person =
    {
        FirstName : string
        LastName : string
    }

// an immutable reference type in C#
public class Person
{
    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public string FirstName { get; private set; }
    public string LastName { get; private set; }
}

编辑:除了编译器中的一些特殊语法之外,F#中的内置类型没有什么特别之处。 你可以自己做 - 这里是listoption例子:

type List<'a> = Empty
              | Item of 'a * List<'a>

type Option<'a> = None
                | Some of 'a

它有助于采用F#程序集并将其加载到Reflector中,以及来自C#和VB.NET的程序集; 您可以看到编译器从F#类型声明中生成标准.NET类型。

更新

有关F#中不同类型的良好参考,请向下滚动到MSDN文章中的 F#类型 我发现MSDN网站确实有一些关于F#的最佳信息。 总而言之,你有F#自己的集合风格(即MapSeq等), 元组 (它们只是几种类型的交叉产品),有区别的联合等等。

F#使用类型推断 ,因此您无需在类型/类中显式指定成员变量的类型。 这意味着,在大多数情况下,您不需要像在C#中那样指定该变量是intdouble或任何引用类型。 基本上隐藏了引用类型和值类型之间的区别。

另外,当你说:

VB.NET中有值和引用类型,而在C#中只有引用

这不完全准确,它在VB.NET / C#中实际上是相同的,请参阅Jon Skeet关于参考与值类型的文章以获得非常明确的解释。

像F#的混合功能/面向对象语言的挑战是,他们必须跨越功能 面向对象的概念。 虽然这使得这些语言非常强大,但它也使它们变得庞大; 大于严格的功能语言或严格的OO语言。 一个最明显的地方是类型目录。

F#类型的官方文档在这里 如您所见,有不少于17种不同类型的......类型。

但要记住的一件事是,任何可以在F#中定义或使用的类型都必须可以表示为.NET类型(这意味着它也可以被其他.NET语言使用)。 一个有趣的例子是Discriminated Union类型(区别联合类型与枚举类似,除了每个备用值可以具有与之关联的其他值)。 其他.NET语言没有区别的联合类型,因此F#编译器将这些类型转换为对象层次结构。 但是在翻译中丢失了一些东西:F#'在编译时'知道'所有可能的类型的情况,但C#和VB.NET必须假设案例的数量是开放的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM