我是函数式编程的新手,我学习F#,如果问题很愚蠢,那就很抱歉。 我想用语法弄清楚并实现一些简单的数据结构,但我不知道它是怎么做的。
应该如何看待链表的实现? 我尝试创建类型,放置mutable属性并定义一组方法来处理类型,但它看起来像面向对象的链表......
答案 0 :(得分:4)
F#中的基本列表类型已经在某种程度上是一个链表。 虽然您可以使用简单的联合类型轻松地重新创建链接列表:
type LinkedList<'t> = Node of 't * LinkedList<'t> | End
一个节点可以有一个值和一个指针到下一个节点,或者是结束。 您可以手动创建一个新列表:
Node(1, Node(2, Node(3, End))) //LinkedList<int> = Node (1,Node (2,Node (3,End)))
或者通过提供一个F#列表来创建一个新的链表:
let rec toLinkedList = function
| [] -> End
| x::xs -> Node (x, (toLinkedList xs))
走过它:
let rec walk = function
| End -> printfn "%s" "End"
| Node(value, list) -> printfn "%A" value; walk list
同样的概念也适用于树结构。 树看起来像
type Tree<'leaf,'node> =
| Leaf of 'leaf
| Node of 'node * Tree<'leaf,'node> list
F#Wikibook在F#中的数据结构上有good article。