Haskell CPS:如何使用Cont monad实现映射和过滤函数?
我一直在尝试学习CPS,似乎我没有真正了解它,你能用Cont monad实现基本的过滤和映射吗?要做到这一点,让我们先从没有monad开始,因为CPS不依赖它Haskell CPS:如何使用Cont monad实现映射和过滤函数?,haskell,map,filter,continuation-passing,Haskell,Map,Filter,Continuation Passing,我一直在尝试学习CPS,似乎我没有真正了解它,你能用Cont monad实现基本的过滤和映射吗?要做到这一点,让我们先从没有monad开始,因为CPS不依赖它 cpsMap :: (a -> b) -> [a] -> ([b] -> r) -> r cpsMap f (a:as) c = cpsMap f as (c.(f a:)) cpsMap _ [] c = c [] map' f xs = cpsMap f xs id 现在Cont单子是微不足道
cpsMap :: (a -> b) -> [a] -> ([b] -> r) -> r
cpsMap f (a:as) c = cpsMap f as (c.(f a:))
cpsMap _ [] c = c []
map' f xs = cpsMap f xs id
现在Cont单子是微不足道的
contMap :: (a -> b) -> [a] -> Cont r [b]
contMap f (a:as) = contMap f as >>= return . (f a :)
contMap _ [] = return []
map'' f xs = runCont (contMap f xs) id
这里唯一的区别是,我们不必亲自去接触延续,而是将价值返回给它
为了可视化它,让我们用map+1[1..3]来跟踪它
请注意,Cont所做的只是将代码的[b]->r->r部分包装在一个新类型下。真的,我们可以把Cont看作
我将把实现过滤器留给您:要做到这一点,我们首先不使用monad,因为CPS不依赖它
cpsMap :: (a -> b) -> [a] -> ([b] -> r) -> r
cpsMap f (a:as) c = cpsMap f as (c.(f a:))
cpsMap _ [] c = c []
map' f xs = cpsMap f xs id
现在Cont单子是微不足道的
contMap :: (a -> b) -> [a] -> Cont r [b]
contMap f (a:as) = contMap f as >>= return . (f a :)
contMap _ [] = return []
map'' f xs = runCont (contMap f xs) id
这里唯一的区别是,我们不必亲自去接触延续,而是将价值返回给它
为了可视化它,让我们用map+1[1..3]来跟踪它
请注意,Cont所做的只是将代码的[b]->r->r部分包装在一个新类型下。真的,我们可以把Cont看作
我将把实现过滤器留给您:我不太确定您在问什么。我认为一个好的第一步是忽略Cont-monad本身,直接使用continuations在CPS中编写一些代码。这里有一些很好的文章可能有用:我不太确定你在问什么。我认为最好的第一步是忽略Cont-monad本身,直接使用continuations在CPS中编写一些代码。这里有一些很好的文章可能会有用:没问题,如果这回答了您的问题,请勾选绿色复选框,将问题标记为已回答CPS映射函数对映射函数本身使用CPS样式,但不用于调用f。如果你真的想要CPS,你也需要改变f的类型。它到底应该如何改变?我觉得你武断地将cpsMap和contMap的结果类型限制为[b]并没有特别的帮助。@kosmikus够公平的了,我认为这会让它更清楚地表明它是一个地图,我已经编辑了它,虽然没有问题,如果这回答了您的问题,请勾选绿色复选框,将问题标记为已回答CPS映射函数对映射函数本身使用CPS样式,但不用于调用f。如果你真的想要CPS,你也需要改变f的类型。它到底应该如何改变?我觉得你武断地将cpsMap和contMap的结果类型限制为[b]并没有特别大的帮助。@kosmikus够公平的了,我想这会让它更清楚地表明它是一张地图,不过我已经编辑过了