函式式程式語言該如何表示樹結構呢?

時間 2021-05-30 21:21:23

1樓:

二叉樹可以描述如下

datatype 'a tree = Empty | Node of 'a tree * 'a * 'a tree

多叉樹可以描述如下

datatype 'a tree = Empty | Node of 'a * 'a tree list

參考 programing in standard ml

2樓:黃玄

表示成這麼乙個型別就好啦:

注意這裡的 是 繫結的型別引數(type argument),很多不在乎可讀性的地方會直接寫成:

是 type-level 的不動點(fixpoint),用 Isorecursive 或 Equirecursive 都行(不知道這兩個怎麼翻,但大概前者是顯式 roll/unroll,後者用 subsumption rule 就好),總之目的是:

這樣就可以讓整個遞迴的樹都 statically-typed 啦。

P.S. 項(term)就用各個組成部分對應的介入規則就好了。

我們也可以定義專門的 term-level data constructor,然後再用 existential type 做成 abstract,把 sum 拓展成 variant,最後再加上 SystemFω 的 type operator,乙個 Haskell/ML 的 ADT 就出來啦……

3樓:ZhenYi

只有葉子節點帶資料:

data Tree a = Leaf a | Node (Tree a) (Tree a)

都帶:data Tree a = Leaf a | Node a (Tree a) (Tree a)

4樓:八爪魚小伙

「樹」由節點組成,每個節點包含多個值,其中乙個值是這個節點儲存的值(value)。除了value,每個節點還需要0個到多個子樹。

有些函式式語言允許定義新的型別,為了表達「樹」這個結構,我們需要定義乙個新的資料型別,tree。

函式式程式語言有乙個資料結構叫list,即一連串同型別的資料(和array很像)。我們可以基於list來定義tree。

以二叉樹為例,即:(value,left,right)

(* 定義乙個新型別,名為「tree」 *)

(* 該型別有兩個constructor:Br開頭的生成內部節點;Lf生成葉子節點。 *)

(* 內部節點的結構是(value,left,right) *)

(* 葉子節點表示null *)

(* 『a是這種樹的節點可以儲存的資料型別的佔位符 *)

type'a

tree=Br

of'a*

'atree*'

atree|Lf

函式式程式語言還有乙個功能叫pattern matching,相當於高階的switch語句。我們可以用pattern matching和遞迴來處理tree的操作。

以輸出值為例,即:

(* 定義乙個新函式來求一棵樹的非葉子節點的個數 *)

(* 「rec」表示這個函式存在遞迴 *)

(* 函式內部對引數tree進行pattern matching,根據tree型別的定義,傳入的引數要麼是內部節點,即Br (v,left,right)的形式;要麼是葉子節點。 *)

(* 如果是內部節點,那麼值為左右子樹非葉子節點個數的和加一(加上該節點) *)

(* 如果是葉子節點,那麼不計算,直接返回0 *)

letrec

size

tree

=match

tree

withBr(

v,left

,right

)->1+

size

left

+size

right|Lf

->0函式式語言自帶遞迴,處理遞迴定義的資料結構很方便。

5樓:

6樓:

define

(scale-tree

tree

factor)(

map(lambda

(sub-tree)(

if (

pair?

sub-tree)(

scale-tree

sub-tree

factor)(

* sub-tree

factor

)))tree

))Many tree operations can be implemented by similar combinations of sequence operations and recursion.其實就是List of List

二叉樹在有代數資料型別(Algebraic data type)的語言可以這樣來表達 (Haskell)

data

Treea=

Empty

|Brancha(

Treea)

(Treea)

換C裡面就是Tagged union

更加"廣泛"的樹可以叫Rose tree

data

RoseTreea=

RoseTreea[

RoseTreea]

BTW, 函式式資料結構入門的可以看 ML程式設計教程 (豆瓣)

7樓:

親請慢用哦。

lisp作為「函式式程式設計」語言,與c語言有何不同?

馬vc 1,此函式非彼函式。lisp 裡函式是first class,換句話說乙個函式是可以當作其他函式的返回值 c 裡邊函式是third class,不能作為其他函式返回值,不能當其他函式的引數。c可以說是algo方言,algo像英語,lisp更像數學。2,函式式語言通有的特性是parameter...

為什麼會有函式式程式設計?

Jason Hu 這個問題就是跟問 為什麼會有數學,數學是為了解決什麼問題 是乙個意思。基於lambda calculus的語言比基於TM的語言具有更數學含義。實際上,任一形式邏輯系統都對應一種函式式語言。相反,基於TM的語言自成一系,並無法繼承數學和邏輯系統裡的知識架構。另外,基於TM的程式語義也...

函式式程式設計immutable data是不是本質上效能就差點?

個人認為是的,而且開發起來好像也更加麻煩,如果要更新值,那麼完了還要把原來的 replace 掉,甚至要把所有有關聯的地方都要做一次 update.意義是什麼?就為了乙個所謂的無隱患 copy 如果說的不對,還希望大家指出正確使用方式。 navegador 它不一定就得真正的去 malloc.只要在...