【发布时间】:2021-06-10 15:01:51
【问题描述】:
这里是一些代码,用于确定列表是否为 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”中声称没有控制运算符(在 4.2 之前)没有直接的风格解决方案,因为在下面的 CPS 风格解决方案中非线性使用延续:
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)
第一个代码如何不与此断言相矛盾?
(以及如何不线性使用延续?)
【问题讨论】:
-
还请注意,该论文使用的是严格的 ML(语言)。至于你的 Haskell 代码,看看如果我们将第一个版本的最后一行更改为
in (x == y && r, ys)会发生什么。
标签: haskell recursion continuations continuation-passing callcc