当前位置: 首页 > 知识库问答 >
问题:

无限列表上的Kleisli合成与折叠

蒋培
2023-03-14

在试图使用Haskell定义从连接通道读取的无限循环时,我遇到了一个想法,即使用单子的Kleisli组合折叠一个无限的部分应用函数列表。这个想法似乎很合理,也很简单,但我遇到了一个奇怪的场景,显然无限列表正在被评估,而不是等待输入。

loop :: Int -> IO Int
loop s = (foldr (<=<) return (repeat process)) s

process :: Int -> IO Int
process i = do
    putStrLn $ show i
    x <- getLine
    return $ i + 1

main = loop 0

共有1个答案

孟沛
2023-03-14

你不能从一个无限的列表的末尾开始访问它--没有尽头。

您编写构建

action0 <=< (action1 <=< (action2 ....))

它具有正确的关联性,但是x<= (粗略地说)在 x之前运行 y

cons x xs = x : xs
snoc x xs = xs ++ [x]

foldr cons [] [1..] = [1..]
foldr snoc [] [1..] = _|_

在一元情况下,事情更复杂,但一般原则的精神是相似的。使用foldr(<=<)return(repeat action)类似于

loop x = do
   x' <- loop x
   action x'

相反,foldr(>=>)return(repeat action)类似于

loop x = do
   x' <- action x
   loop x'

 类似资料:
  • 我试图在Haskell中编写一个函数,它可以做以下操作:输入一个整数列表,对于这些整数,使用map,有一个函数应用于它们,返回一个无限的整数列表。然后,我想使用union将foldr应用于列表,这样结果将是列表中这些列表的union。 现在的问题是,当我以10‘函数’[1,2]为例进行计算时,它会首先计算1的无限列表,因为它是一个无限列表,它永远不会对2进行计算。因此,它只返回输入列表中第一个元素

  • 我知道对无限列表进行排序是不可能的,但我正试图为n个数的倍数的无限递增列表写一个定义。 我已经有这个功能了 它返回n的无限倍数列表。但现在我想构建一个函数,给定一个返回列表中所有数字的倍数的无限递增列表。所以函数

  • 在你想隐藏部分内容的显示时,可以使用折叠列表。 实例 <ul data-accordion>   <li class="accordion-navigation">     <a href="#demo">Simple Collapsible</a>     <div id="demo">       本站 -- 学的不仅是技术,更是梦想!!!     </div>   </li> </ul> <

  • 本文向大家介绍js实现列表向上无限滚动,包括了js实现列表向上无限滚动的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js实现列表向上无限滚动的具体代码,供大家参考,具体内容如下 先来一张效果图 html js css(样式自己调) 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍python列表生成式与列表生成器的使用,包括了python列表生成式与列表生成器的使用的使用技巧和注意事项,需要的朋友参考一下 列表生成式:会将所有的结果全部计算出来,把结果存放到内存中,如果列表中数据比较多,就会占用过多的内存空间,可能会导致MemoryError内存错误或者导致程序在运行时出现卡顿的情况 列表生成器:会创建一个列表生成器对象,不会一次性的把所有结果都计算出来,如

  • 我正在学习主干,现在正在考虑如何应用无限卷轴,并在每次卷轴位于页面底部时从我的收藏中提取/加载20个项目。我一直在寻找不同的LIB之类的东西,但没有真正接近。有谁能解释/展示这是如何最好地完成的? 我现在已经添加了infiniscroll.js插件并试图让它工作。但是在滚动中它不会加载新项目。我应该在appendRender上做什么?怎么做?