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.只要在...