簡體   English   中英

這個折疊樹函數如何在Haskell中工作

[英]How this Fold Tree Function works in Haskell

在這里,我試圖理解這個將樹折疊成一個值的函數。 它顯示foldTree將兩個函數作為參數,它將第一個函數應用於Tree a的元素,然后將結果傳遞給第二個函數(b->b->b) ,再次執行某些操作並生成最終結果。

foldTree :: (a -> b) -> (b -> b -> b) -> Tree a -> b
foldTree f g (Leaf x) = f x
foldTree f g (Node tl tr) = g (foldTree f g tl) (foldTree f g tr) 

我正在嘗試關注輸入,看看它是如何工作的。

Input 1:  foldTree (*2) (\x y -> x + y) (Leaf 6)
Input 2:  foldTree (*2) (\x y -> x + y) (Node (Node (Leaf 1) (Leaf 2)) (Leaf 4))

它回來了

Output 1 : 12
Output 2 : 14

我在理解中遇到的問題是執行第二個函數參數操作的位置? 以及它如何實際將值傳遞給第二個函數,顯然第二個函數將兩個值作為參數但第一個函數只返回一個值...從第二個值傳遞的位置? 我能說兩次第一次函數的結果,以便xy值相同嗎? 因為第二個函數(\\xy -> x + y)兩個參數? 但結果與輸出1和2中提到的結果不同。

其次,它在執行第二個函數后返回最終結果,或者在僅應用第一個函數后返回結果,因為我很困惑,即使我刪除了第二個函數,它也會產生相同的結果。

第三, g在兩個大括號之外的目的是什么? ***g*** (foldTree fg tl) (foldTree fg tr)它從一開始就把它當作數據構造函數或者是什么? 我知道數據構造函數可以構造為智能構造函數,但在這里它是如何處理的。

我很難理解這一點,可能是我在這個問題上復雜化了很多概念? 請不要猶豫,詳細了解。

要了解foldTree fg tree的結果,您可以使用以下技術:

  • 使用構造函數記下tree的值,例如在我們的示例中(Node (Node (Leaf 1) (Leaf 2)) (Leaf 4))
  • f語法替換Leaf ,用g替換Node 對於前面的例子,我們得到(g (g (f 1) (f 2)) (f 4))
  • 使用函數fg的定義來計算最后一個表達式的結果。 例如,我們得到((+) ((+) ((*2) 1) ((*2) 2)) ((*2) 4)) ,即((+) ((+) (1*2) (2*2)) (4*2))((1*2) + (2*2)) + (4*2) ,即(2+4)+8 = 14

注意我們如何使用f (一元函數)和帶有g (二元函數)的二進制構造函數Node替換Leaf一元構造函數。 因此,我們總是為函數提供正確數量的參數。 更一般地說,類型將匹配得很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM