繁体   English   中英

Haskell CPS:如何使用Cont monad实现地图和过滤器功能?

[英]Haskell CPS: How to implement map and filter functions using Cont monad?

我一直在尝试学习CPS,似乎我并没有真正了解它,您可以使用Cont monad实现基本的过滤器和地图吗?

为此,由于CPS不依赖于monad,因此让我们首先开始使用monad。

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 monad是微不足道的

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

唯一的区别是我们不必自己去触摸延续,而是为我们return值。

为了可视化它,让我们用map'' (+1) [1..3]对其进行跟踪map'' (+1) [1..3]

as      | c
[1,2,3] | id
[2,3]   | id . (2 :)
[3]     | id . (2 :) . (3 :)
[]      | id . (2 :) . (3 :) . (4 :)
id . (2 :) . (3 :) . (4 :) $ []
[2, 3, 4]

注意,所有Cont所做的只是将代码的([b] -> r) -> r部分包装为新类型。 真的,我们可以将Cont视为

newtype Cont r a = Cont ((a -> r) -> r)

我将实施过滤器留给您:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM