簡體   English   中英

哈斯克爾的樹木工程

[英]Tree works in Haskell

我正在從事一個項目,並且因為我不習慣Haskell而感到有些困難,因為這對我來說很難編碼。

我想要一棵有葉子和樹枝的樹,葉子將僅作為整數輸入,例如1,2,3。 分支僅對operation1和operation2是char。

這些操作從葉子獲取輸入並進行計算,然后將輸出發送到其他分支,然后再次進行計算,直到達到最高位。

我到目前為止的代碼:

data Tree = Leaf Float | Branch Char Tree Tree deriving (Show,Eq,Ord)

insertElement x (Leaf y) = Leaf y

insertElement x (Branch a left right) = Branch a (insertElement x left) right                                                           
doIt (x:xs) (y:ys) =  insertElement ((Branch y (Leaf x) (Leaf (head xs))))                                  

op1 num1 num2 = 1+num1+num2*2
op2 num1 num2 = 1-num1*num2*2

樹將被遞歸創建,我嘗試使用foldr來做到這一點,但是由於它不是二叉樹而沒有用。

任何幫助都會很好。

我不確定我是否理解問題,但也許您想要這樣的事情:

data Op = Op1 | Op2
data Tree = Leaf Float | Branch Op Tree Tree

eval :: Tree -> Float
eval (Leaf x) = x
eval (Branch Op1 l r) = op1 (eval l) (eval r)
eval (Branch Op2 l r) = op2 (eval l) (eval r)

op1 :: Float -> Float -> Float
op1 num1 num2 = 1+num1+num2*2
op2 :: Float -> Float -> Float
op2 num1 num2 = 1-num1*num2*2

example :: Float
example = eval (Branch Op1 (Leaf 3) (Branch Op2 (Leaf 2) (Leaf 1)))

如果那是您想要做的,請考慮使用比Tree少的通用類型,例如

data Exp = Lit Float | Op1 Exp Exp | Op2 Exp Exp
eval :: Exp -> Float
eval (Lit x) = x
eval (Op1 l r) = op1 (eval l) (eval r)
...

暫無
暫無

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

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