繁体   English   中英

原始递归If else else实际执行if else else

[英]Primitive Recursion If Then Else actually executing If Else Then

我对If If 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 3P 4它将完全中断(每次都返回'then'值)。 ite[0,2,3]应该返回3ite[1,2,3]应该返回2 相反,情况正相反。 我该如何纠正?

你觉得这堂课怎么样? 我注意到您和我有非常相似的作业,非常相似。

首先,您想创建一个模仿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,则为false;否则,如果数字为任意值(0 <),则为true。 如果“堆栈”的头为0,PR构造会通过评估其第一个参数来执行此操作,否则它会评估其第二个参数,以期希望沿该行的某个位置终止(通常是将头作为计数器递减,最终执行第一个参数)。 但是出于所有意图和目的,我们可以说第二个表达式将在(0 <)上执行。

那么,我们如何解决您的实施问题呢? 简单:

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

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

ite = PR (P 2) (P 1)

我认为,我也没有完成作业,如果我错了,我将不胜感激。

由于我没有足够的能力发表评论,因此我将其留在这里。

我认为应该

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

而不是原始版本

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

如果第一个值不为0,否则将选择X。否则,将不返回任何随机值。 它还使写作和/或/ ...更加容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM