簡體   English   中英

使用Haskell定義普通表單

[英]Defining a normal form with Haskell

我正在嘗試獲得一個表達式並將其轉換為標准形式。 為了更好地闡明我的目的,假設您為表達式定義一般樣式,如下所示:

Σ(a * b)//產品總和

現在,如果你給出的輸入不是那種格式,如:(a + b)*(c + d),你需要先將它標准化。(實際上它只是一個簡單的例子而不是我的情況)現在我有一個已經用ML編寫的代碼,它太長了 在這里你可以看到一些snipets:

rew(p_choice(x,p_nil)) = rew(x) |
rew(p_choice(p_nil,x)) = rew(x) |
rew(p_sum(d,p_nil)) = p_nil |
rew(p_sum(d,p_choice(x,y))) = rew(p_choice(rew(p_sum(d,x)),rew(p_sum(d,y)))) 
rew(p_cond(b,p_nil,p_nil)) = p_nil |
rew(p_cond(b,p_choice(x,y),p_nil)) =rew(p_choice(rew(p_cond(b,x,p_nil)),rew(p_cond(b,y,p_nil)))) |
rew(p_cond(b,p_sum(x,y),p_nil)) = rew(p_sum(x,rew(p_cond(b,y,p_nil)))) |
rew(p_cond(b1,p_cond(b2,x,p_nil),p_nil)) = rew(p_cond(b1 andalso b2, x,p_nil)) |
rew(p_cond(b,x,p_nil)) = p_cond(b,x,p_nil) |
rew(p_cond(b,x,y)) =
    rew(p_choice(rew(p_cond(b,x,p_nil)),rew(p_cond(not(b),y,p_nil)))) 

我的問題是,Haskell是否引入了任何可以幫助更好地完成代碼的功能?

Haskell中的模式匹配工具非常相似,我不認為最大的Haskell排他性(類型,懶惰等)會對你有所幫助。 也就是說,可能有辦法讓ML更簡單。

要考慮的一件事是將處理分成更小的步驟。 現在有一些重復,取決於是左邊還是右邊的參數。 您可以嘗試轉換為選擇一個特定訂單的中間標准表單。

另一個技巧是將每個步驟的處理與遞歸分開,這樣就不會將樹遍歷與節點處理混合在一起。 您可以編寫函數來處理每個節點的stp,然后使用單獨的折疊函數將所有內容綁定在一起。

data Tree = Leaf Int | Node Tree Tree

directsum :: Tree -> Int
directSum (Leaf n) = n
directsum (Node a b) = (directsum a) + (directsum b)

-- vs

foldtree :: (Int -> r) -> (r -> r -> r) -> Tree  -> b
foldtree onLeaf onNode t =
    go t
  where
    go (Leaf n)   = onLeaf n
    go (Tree a b) = onNode (go a) (go b)

foldedSum :: Tree -> Int
foldedsum t =
    foldtree leafsum nodesum t
  where
    leafsum n = n
    nodesum a b = a + b

暫無
暫無

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

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