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

Yab*_*uar 5 f#

堆栈与F#中的List是一样的吗?那么F#中的堆栈和序列呢?队列怎么样?

pet*_*ebu 7

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

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

type IStack<'A> =
    abstract member Push : 'A -> IStack<'A>
    abstract member Pop : unit -> 'A * IStack<'A>
Run Code Online (Sandbox Code Playgroud)

或者作为递归数据类型:

type Stack<'A> = Stack of 'A * Stack<'A> | Empty
Run Code Online (Sandbox Code Playgroud)

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


Gre*_*egC 4

F# 中的序列是一个延迟计算的对象链,有点像 IEnumerable

这是一本书要读。还有另外一个

引用: Stack<'T> 类可以被认为是 F# 列表的可变版本。

  • 不仅仅是“有点像 IEnumerable”。`seq&lt;'T&gt;` 是 `IEnumerable&lt;'T&gt;` 的别名 - 它们是相同的类型。 (3认同)