2014-05-12 25 views
0

我是Haskell的新手,希望將自定義樹的樹葉的值寫入記錄。我從這開始。如何用樹的元素填充記錄

data MyTree = A Int | B Int MyTree | C Double | D Double MyTree 

test = B 1 (B 1(D 0.02(A 2))) 


data MyRecord = MyRecord {A, B :: Int, C :: Double, D :: (Int,Double)} 
emptyRecord = MyRecord{a = 0, b = 0, c = 0, d =(0,0)} 

現在我開始是這樣的:

MyTree2MyRecord :: MyTree -> MyRecord 
MyTree2MyRecord(A a1) = emptyRecord{a = a1} 
MyTree2MyRecord(B b1 myTree) = emptyRecord {b = b1} 
MyTree2MyRecord(C c1) = emptyRecord {c = c1} 
MyTree2MyRecord(D d1 myTree) = emptyRecord {d = d1} 
where mytree = MyTree2MyRecord -{dont know the recursive call to iterate through the tree and get the values of the leafs} 

我理解像總結了樹等的葉子的簡單的例子,但不能想出了一個解決這個問題。我真的很感激一個小提示。謝謝你們

+0

這甚至是什麼_supposed_做什麼?在樹中有多個整數值,但在MyRecord中只有一個,你需要指定一些如何組合它們的想法。 – leftaroundabout

回答

0

有一些問題與您的代碼:

  • 功能名稱應與小案字母開頭。因此,記錄數據結構應該是這樣的:

data MyRecord = MyRecord {a, b :: Int, c :: Double, d :: (Int,Double)}

  • 和你的函數名應該是這樣的:

myTree2MyRecord :: MyTree -> MyRecord

通過實際代碼現在去,你似乎在幾乎正確的道路上。但爲了找到解決辦法,你必須回答一些問題:

  • 究竟該Int表示在d :: (Int, Double)什麼?

  • 當您對數據構造函數(如AB等)進行模式匹配時,您似乎將MyTreeADT的值分配給記錄。想想那裏的遞歸案例。什麼輸出你要輸入這樣的:

myTree2MyRecord (B 1 (B 1 (A 1)))

您當前的實現只是丟棄在它的MyTree值:

myTree2MyRecord(B b1 myTree) = emptyRecord {b = b1} 

而不是丟棄想到應該發生什麼在這種情況下爲myTree。這將導致遞歸解決方案。

最後,制定你想爲你所賜給了討論的輸入輸出什麼信息:

test = B 1 (B 1(D 0.02(A 2))) 

回答完這些問題,我想你會重構代碼,並自行解決這個問題。

+0

好吧,我想嘗試一下這樣的幫助功能: – user3588998

+0

明白了。我用myTree2MyRecord myTree = fun_help myTree(0,0,0,(0,0))這樣的幫助函數完成了它,並且覆蓋了它的每一種情況。非常感謝 – user3588998

+0

@ user3588998很高興你解決了它。請仔細看看你的MyTree。如果你不使用某種類型,最好將它們刪除或適當地使用你的邏輯。 – Sibi