[英]Haskell “Source reduction”
我正在修改即将到来的Haskell考试,我不理解过去论文中的一个问题。 谷歌没有任何用处
fst(x, y) = x
square i = i * i
i)源减少,使用Haskells懒惰评估,表达式:
fst(square(3+4), square 8)
ii)使用严格的评估,源减少相同的表达式
iii)说明懒惰评估的一个优点和严格评估的一个优点
我不明白什么是源减少?
缩减是lambda演算中的一个术语,它涉及一个语义保留变换,用一个等价项代替一个术语。 对于你给出的例子,最重要的减少是
Beta减少是lambda演算中的基本规则,在像Haskell这样的纯粹,懒惰的语言中,它总是保留语义。 测试版规则是:
(\x. e) m
可以用e
代替,用m
代替x
。 (替换必须避免“捕获” m
的x
自由实例。)
您的教练很可能希望您将减少量组合如下:
请注意,您经常可以选择减少哪个应用程序; 例如,在你给出的术语中,有两个square
和fst
应用程序可以这种方式减少。 (+的应用也可以减少,但涉及常数的减少需要不同的规则。)
从问题中我看到你的导师希望你反复减少每个术语,直到它达到正常形式 ,并且你的教练希望你展示你对不同减少策略的理解。 “源减少”中的“源”一词是多余的; 减少意味着以某种语言操纵源术语。 我想说的问题如下:
使用与Haskell的惰性求值相对应的约简策略,将以下表达式减少为弱头正态形式。 显示缩减序列中的每个步骤。
使用与严格函数语言中的评估相对应的缩减策略,将以下表达式缩减为正常形式。
我可能会选择不那么腼腆,只是命名减少策略:按需求减少策略和逐个减值策略。
从问题的结构来看,它可能只是意味着“手工评估表达”,例如
head (map primeTest (enumFromTo 1000 2000))
在懒惰(仅在需要时评估)评估,
head (map primeTest (enumFromTo 1000 2000))
= head (map primeTest (1000 : enumFromTo 1001 2000))
= head (primeTest 1000 : map primeTest (enumFromTo 1001 2000))
= primeTest 1000
= False
严格(先评价一切)评价
head (map primeTest (enumFromTo 1000 2000))
= head (map primeTest (1000 : enumFromTo 1001 2000))
= ...
= head (map primeTest [1000, 1001, ..., 2000])
= head (primeTest 1000 : map primeTest [1001, 1002, ..., 2000])
= head (False : map primeTest [1001, 1002, ..., 2000])
= ...
= head [False, False, ..., False]
= False
我能找到的唯一相关的地方是http://www.cs.bham.ac.uk/internal/modules/2009/11582.html ,其中“source reducation”被列为“编程技术”。 (O_O)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.