gpt4 book ai didi

haskell - Palindrome 和 Danvy 对直接风格的评论

转载 作者:行者123 更新时间:2023-12-03 14:12:21 29 4
gpt4 key购买 nike

这是一些代码,以“直接样式”确定列表是否是 n+1 比较中的回文

pal_d1 :: Eq a => [a] -> Bool
pal_d1 l = let (r,_) = walk l l in r
where walk l [] = (True,l)
walk l (_:[]) = (True,tail l)
walk (x:l) (_:_:xs) = let (r, y:ys) = walk l xs
in (r && x == y, ys)
可以在几个例子上进行测试
-- >>> pal_d1 [1,2,1]
-- True

-- >>> pal_d1 [1,2,2,1]
-- True

-- >>> pal_d1 [1,2,3,4,2,1]
-- False
Danvy 在“ There and back again”中声称,由于以下 CPS 风格解决方案中延续的非线性使用,没有控制运算符(4.2 之前)没有直接风格的解决方案:
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)
第一个代码如何与此断言不矛盾?
(以及如何不线性使用延续?)

最佳答案

他没有声称没有控制运算符(operator)就没有解决方案。

The continuation is not used linearly and therefore mapping this program back to direct style requires a control operator.


这篇论文的背景是研究直接风格和 CPS 之间的系统转换,该段的主张是,如果以花哨的方式使用延续,从 CPS 回归是棘手的。
通过一些努力,您可以将其重新调整为漂亮的形状,但问题仍然存在,编译器如何自动执行此操作?

(and how is the continuation not used linearly ?)


在论文中,继续在 andalso的右边( && ) 所以如果左操作数是 False 则将其丢弃.
在操作语义中,您可以将延续视为评估上下文,并且在该 View 中丢弃延续对应于引发异常。当然可以,但关键是这需要源语言中的额外机制。

关于haskell - Palindrome 和 Danvy 对直接风格的评论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66602530/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com