首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将函数转换为CPS

将函数转换为CPS
EN

Stack Overflow用户
提问于 2015-10-25 03:13:54
回答 2查看 330关注 0票数 0

我有以下until的CPS实现

代码语言:javascript
复制
until' p f x cc = p x (\y -> if y then cc(x)
                             else until' p f (f x (\z -> cc(z))) cc)

哪种类型检查正常!现在,尝试CPS map

代码语言:javascript
复制
map' f (x:xs) cc = f x (\y -> map f xs (\ys -> cc(y:ys)))

另一种可能的实现是:

代码语言:javascript
复制
map' f (x:xs) cc = cc(f x (\y cc' -> map f xs (\ys -> cc'(y:ys))))

但是,它们都没有进行类型检查。我在哪里做错了?

代码语言:javascript
复制
    Couldn't match expected type ‘([a1] -> t2) -> t1’
                with actual type ‘[(a1 -> t1) -> t]’
    Relevant bindings include
      y :: a1 (bound at test.hs:6:26)
      cc :: [a1] -> t2 (bound at test.hs:6:15)
      f :: a -> (a1 -> t1) -> t (bound at test.hs:6:6)
      map' :: (a -> (a1 -> t1) -> t) -> [a] -> ([a1] -> t2) -> t
        (bound at test.hs:6:1)
    The function ‘map’ is applied to three arguments,
    but its type ‘(a -> (a1 -> t1) -> t) -> [a] -> [(a1 -> t1) -> t]’
    has only two
    In the expression: map f xs (\ ys -> cc (y : ys))
    In the second argument of ‘f’, namely
      ‘(\ y -> map f xs (\ ys -> cc (y : ys)))’
Failed, modules loaded: none.
EN

回答 2

Stack Overflow用户

发布于 2015-10-25 03:50:43

在CPS中重写时,continuation将获取结果,因此,如果您编写预期类型的map函数,您将拥有:

代码语言:javascript
复制
mapk :: (a -> b) -> [a] -> ([b] -> r) -> r

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

代码语言:javascript
复制
map' f (x:xs) cc = f x (\y -> map f xs (\ys -> cc(y:ys)))

yys应该具有相同的类型([b]),但是您试图将它们与(:)结合使用,后者需要b[b]。取而代之的是你想要的东西:

代码语言:javascript
复制
mapk _ [] k = k []
mapk f (x:xs) k = mapk f xs (\rs -> k $ (f x):rs)
票数 4
EN

Stack Overflow用户

发布于 2015-10-25 05:41:36

这是一个打字错误

代码语言:javascript
复制
map' f (x:xs) cc = f x (\y -> map f xs (\ys -> cc(y:ys)))

应该是:

代码语言:javascript
复制
map' f (x:xs) cc = f x (\y -> map' f xs (\ys -> cc(y:ys)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33322257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档