簡體   English   中英

Haskell 評估

[英]Haskell Evaluation

我有以下代碼塊:

data G = F G G | H Int deriving (Show, Eq)

example :: Int -> G -> G
example 0 (H i) = (H i)
example n (H i) = F (example (n-1) (H i)) (example (n-1) (H i))
example n (F i1 i2) = F (example n i1) (example n i2)

當我運行example 0 (F (H 1) (H 2)) ,正如預期的那樣返回F (H 1) (H 2)

當我運行example 1 (F (H 1) (H 2)) ,它返回F (F (H 1) (H 1)) (F (H 2) (H 2))

這不是我想要的。 我需要返回F (F (H 1) (H 1)) (H 2)

我的意思是在第 6 行, example n (F i1 i2) = F (example n i1) (example n i2) ,我調用了遞歸函數兩次。 但是我希望(example n i1)在我們評估之前先評估並更新變量n (example n i2)

對這個確切問題的任何幫助/解決方案將不勝感激。 我已經嘗試了幾個小時,但成功率為零。

問題似乎是您想使用example來 'update' n 但是,您不能直接這樣做,因為example返回一個G值,而n是一個Int

那么,您似乎需要一個函數G -> Int 問題是沒有明確正確的方法來編寫該函數。 事實上,有無數種可能的實現方式。 這是一個示例:

evalZero :: G -> Int
evalZero = const 0

evalOne :: G -> Int
evalOne = const 1

evalLeft :: G -> Int
evalLeft (H i) = i
evalLeft (F g _) = evalLeft g

evalRight :: G -> Int
evalRight (H i) = i
evalRight (F _ g) = evalRight g

evalSum :: G -> Int
evalSum (H i) = i
evalSum (F g1 g2) = evalSum g1 + evalSum g2

evalProduct :: G -> Int
evalProduct (H i) = i
evalProduct (F g1 g2) = evalProduct g1 * evalProduct g2

evalPlusOneProduct :: G -> Int
evalPlusOneProduct (H i) = i + 1
evalPlusOneProduct (F g1 g2) = evalPlusOneProduct g1 * evalPlusOneProduct g2

-- etc.

正如evalPlusOneProduct所示,您可以任意添加或減去一個常量Int ,或者就此而言,乘以一個常量,或者執行更復雜的任意計算。 因為有無限多個整數,所以有無限多個實現(雖然,當然,從技術上講,我們受到Int范圍的限制)。

一旦您弄清楚如何將G轉換為Int ,您就可以使用該函數從n和左G值計算新值n1

暫無
暫無

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

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