如何使用功能方法实现数据结构? (链接列表,树等)

时间:2016-12-26 12:34:35

标签: f# functional-programming

我是函数式编程的新手,我学习F#,如果问题很愚蠢,那就很抱歉。 我想用语法弄清楚并实现一些简单的数据结构,但我不知道它是怎么做的。

应该如何看待链表的实现? 我尝试创建类型,放置mutable属性并定义一组方法来处理类型,但它看起来像面向对象的链表......

1 个答案:

答案 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