将功能转换为CPS


氷寒
2025-01-23 02:28:03 (23天前)


我有以下内容

CPS
</跨度>
执行直到:

直到’p f x cc = p x(\ y - &gt;如果y则cc(x)
否则直到’p f(f x(\ z - &gt; cc(z)))cc)

哪种类型检查好!现在……,试着

CPS
</跨度>
地图:

map’f(x:xs)cc = f x(\ y - &gt; map f xs(\ ys - &gt; cc(y:ys)))

另一个可能的实现

map’f(x:xs)cc = cc(f x(\ y cc’ - &gt; map f xs(\ ys - &gt; cc’(y:ys))))

但是没有一个……

3 条回复
  1. 0# 老人与海。 | 2019-08-31 10-32



    这是一个错字




    1. map f (x:xs) cc = f x (\y -> map f xs (\ys -> cc(y:ys)))

    2. </code>


    应该:




    1. map f (x:xs) cc = f x (\y -> map f xs (\ys -> cc(y:ys)))

    2. </code>

  2. 1# 咿呀哟 | 2019-08-31 10-32



    在CPS中重写时,continuation将获得结果,因此如果您编写了地图函数的预期类型,则:




    1. mapk :: (a -> b) -> [a] -> ([b] -> r) -> r

    2. </code>


    所以continuation将结果列表作为参数。如果你看一下你的实现:




    1. map f (x:xs) cc = f x (\y -> map f xs (\ys -> cc(y:ys)))

    2. </code>



    y



    ys

    应该有相同的类型(

    [b]

    )但是你正试图将它们结合起来

    (:)

    期待一个

    b



    [b]

    。相反,你想要的东西:




    1. mapk _ [] k = k []
      mapk f (x:xs) k = mapk f xs (\rs -> k $ (f x):rs)

    2. </code>

登录 后才能参与评论