Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell CPS:如何使用Cont monad实现映射和过滤函数?_Haskell_Map_Filter_Continuation Passing - Fatal编程技术网

Haskell CPS:如何使用Cont monad实现映射和过滤函数?

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单子是微不足道

我一直在尝试学习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单子是微不足道的

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够公平的了,我想这会让它更清楚地表明它是一张地图,不过我已经编辑过了