[英]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.