微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

回文和丹维对直接风格的评论

如何解决回文和丹维对直接风格的评论

这里有一些代码在 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 举报,一经查实,本站将立刻删除。