如何解决回文和丹维对直接风格的评论
这里有一些代码在 n+1 比较中决定一个列表是否是回文,“直接风格”
-- >>> pal_d1 [1,2,1]
-- True
-- >>> pal_d1 [1,3,4,1]
-- False
可以在几个例子上测试
pal_cps1 :: Eq a => [a] -> Bool
pal_cps1 l = walk l l (\_ -> trace "called" True)
where
walk l [] k = k l
walk l (_:[]) k = k (tail l)
walk (x:xs) (_:_:ys) k = walk xs ys (\(r:rs) -> x == r && k rs)
Danvy 在“There and back again”中声称没有控制运算符(就在 4.2 之前)没有直接的样式解决方案,因为在下面的 cps 样式解决方案中非线性使用了延续:
from odoo import models,fields,api
from datetime import datetime,date,timedelta
class crm_lead(models.Model):
_inherit = 'crm.lead'
date_deadline = fields.Datetime(string='Fermeture prévue')
@api.onchange('create_date')
def _onchange_enddate(self):
if self.create_date:
date_end = ( date.today() + timedelta(30))
date_deadline = date_end
(以及如何不线性使用延续?)
解决方法
他并没有声称没有控制运算符就没有解决方案。
延续不是线性使用的,因此将此程序映射回直接样式需要一个控制运算符。
这篇论文的背景是研究直接风格和 CPS 之间的系统转换,并且该段落声称,如果以奇特的方式使用延续,从 CPS 返回是很棘手的。
通过一些努力,您可以将其改回一个漂亮的形状,但问题仍然存在,编译器如何自动执行此操作?
(以及如何不线性使用延续?)
在论文中,延续在 andalso
(&&
) 的右侧,因此如果左操作数为 False
,则将其丢弃。
在操作语义中,您可以将延续视为评估上下文,在该视图中,放弃延续相当于抛出异常。当然可以做到,但关键是这需要源语言中的额外机制。
,CPS 代码(在问题的原始版本中 --- 由 OP 编辑)似乎有问题。看起来应该是
walk (x:xs) (_:_:ys) k = walk xs ys (\(z:zs) -> x == z && k zs)
非 CPS 代码从中间开始比较,并针对长度为 n `div` 2
的列表进行 n
比较。即使发现不匹配,它也会继续测试,因此是“线性”。
在这种情况下,CPS 代码立即退出,因为 (False && undefined) == False
成立; “非线性”也是如此。这两个不等价,所以第一个没有说明第二个。
正如 the other answer 所说,不调用延续相当于在没有延续的代码中抛出异常,论文作者显然称之为“直接[即非 CPS(?) -- wn] 样式”。
(我没读过论文)
顺便说一句,以“直接”风格编写早期退出的解决方案并不困难。我们将使用相同的海龟和野兔技巧来发现一半,同时反向构建前一半,然后在 Haskell 中调用 and $ zipWith (==) first_half_reversed second_half
,或者在严格的语言中调用其等效的短路直接递归变体像例如方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。