1

我对 If Then Else 定义中的预测有疑问。它实际上是作为 If-Else-Then 执行的。

 import Prelude hiding (pred,and,or,not)

 data PR = Z
     | S
     | P Int
     | C PR [PR]
     | PR PR PR
     deriving Show
 eval :: PR -> [Integer] - Integer
 eval Z _ = 0
 eval S [x] = x+1
 eval (P n) xs = nth n xs
 eval (C f gs) xs = eval f (map (\g -> eval g xs) gs)
 eval (PR g h) (0:xs) = eval g xs
 eval (PR g h) (x:xs) = eval h ((x-1) : eval (PR g h) ((x-1):xs) : xs)

 nth _ [] = error "nth nil"
 nth 0 _ = error "nth index"
 nth 1 (x:_) = x
 nth (n) (_:xs) = nth (n-1) xs

 one = C S [Z]
 plus = PR (P 1) (C S [P 2])
 ife = PR (P 1) (C (P 2) [P 3, P 4])

如果我尝试交换P 3并且P 4它完全中断(每次返回'then'值)。ite[0,2,3]应该返回3并且ite[1,2,3]应该返回2。相反,正在发生相反的情况。我该如何纠正?

4

2 回答 2

5

你觉得这门课怎么样?我注意到你和我的家庭作业非常相似,非常相似。

那么首先,您想要创建一个模拟 IF-Then-Else 模型的原始递归函数。所以,

eval ite [0,1,2] => 1

eval ite [1,2,3] => 3

并且根据您提供的内容,您似乎在相反的情况下获得了具有相同质量的功能,具体取决于第一个输入。

ife = PR (P 1) (C (P 2) [P 3, P 4])

现在你的功能在说什么?您的 ITE 实现使用原始递归构造,这是一个开始,因为在此您可以根据条件将执行拆分为两个不同的表达式。布尔代数中使用的条件相同。如果 0 我们有假,否则如果一个数字评估为任何 (0<),我们有真。如果“堆栈”的头部为 0,PR 构造通过评估其第一个参数来执行此操作,否则它评估其第二个参数以希望沿着这条线的某个地方终止(通常时间递减头部作为您的计数器并最终执行第一个参数)。但是出于所有意图和目的,我们可以说第二个表达式将在 (0<) 上执行。

呸!那么,我们如何修复您的实施!?简单的:

ife = PR (P 2) (C (P 1) [P 3, P 4])

我们切换您的两个投影,因为您只是将它们向后。如果栈首是 Z,我们要投影第二个表达式,否则我们投影第一个。或者更好:

ite = PR (P 2) (P 1)

我想,我的作业也没有完成,如果我错了,我将非常感谢任何额外的见解。

于 2012-11-26T08:05:54.343 回答
0

由于我不够好,无法发表评论,我将把它留在这里。

我认为应该是

ife = PR (P 1) (C (P 2) [P 3, P 3])
                                ^

而不是原来的版本

ife = PR (P 1) (C (P 2) [P 3, P 4])
                                ^

如果第一个值不是 0 否则 Y 将选择 X。这样不会返回随机值。它也使写作和/或/...更容易。

于 2013-11-26T09:19:47.863 回答