关于F#的堆栈和列表的问题

时间:2011-05-06 15:50:07

标签: f#

是否与F#中的List相同?那么F#中的堆栈和序列呢?队列怎么样?

3 个答案:

答案 0 :(得分:7)

堆栈和队列是抽象数据类型,可以通过几种不同的方式实现。 F#列表实现为不可变的单链表。由于从单个链接列表的前面预先添加或删除项目是一个恒定时间操作,因此F#列表构成堆栈的良好表示。但是附加到列表是线性时间,因此它们不太适合队列。

如果您需要 ephemeral 堆栈,那么您也可以使用内置的System.Collections.Generic.Stack<T>。对于持久性堆栈,您可以自己实现它。这个界面可能是一个好的开始:

type IStack<'A> =
    abstract member Push : 'A -> IStack<'A>
    abstract member Pop : unit -> 'A * IStack<'A>

或作为递归数据类型:

type Stack<'A> = Stack of 'A * Stack<'A> | Empty

但是为了尝试回答你的问题,虽然堆栈和F#列表不一样,但是列表在函数式编程中很普遍,并且由于它们的性能特征,它们被用在C#程序员自然会达到堆栈的地方。由于它们是持久的,因此它们也更适合功能程序(它转换不可变数据结构而不是修改可变数据结构)。

答案 1 :(得分:4)

F#中的序列是一个延迟评估的对象链,类似于IEnumerable

这是一个book来阅读。并another one

引用: 堆栈&lt;'T&gt; class可以被认为是F#列表的可变版本。

答案 2 :(得分:0)

如果您的意思是在典型的数据结构课程中学习的堆栈和队列,那么F#list和它们完全不同。