Functional programming 无限IO列表的等待时间

Functional programming 无限IO列表的等待时间,functional-programming,frege,Functional Programming,Frege,我试图使用一个无限列表,其中可能包含以下类型的元素: IO(可丢弃a) 我只对使用Right类型的元素感兴趣 列表已排序右元素始终位于第一位,然后是左元素 问题是我使用的实现是错误的,因为函数sequence计算无限列表,所以函数永远不会结束 takeWhileRight :: [IO (Either Throwable a)] -> IO [(Either Throwable a)] takeWhileRight list = do unwrappedList <- seq

我试图使用一个无限列表,其中可能包含以下类型的元素:

IO(可丢弃a)

  • 我只对使用
    Right
    类型的元素感兴趣
  • 列表已排序<代码>右元素始终位于第一位,然后是
    元素
问题是我使用的实现是错误的,因为函数
sequence
计算无限列表,所以函数永远不会结束

takeWhileRight :: [IO (Either Throwable a)] -> IO [(Either Throwable a)]
takeWhileRight list = do
  unwrappedList <- sequence $ list -- BANG!!
  return $ takeWhile isRight $ unwrappedList

isRight :: (Either Throwable a) -> Bool
isRight x = case x of
  Right x -> true
  Left  x -> false
takeWhileRight::[IO(任意可丢弃的a)]->IO[(任意可丢弃的a)]
takeWhileRight list=do
未包装布勒
isRight x=的情况x
右x->true
左x->假

关于如何正确使用该列表,您有什么想法吗?

是的,这不适用于
序列

你需要像这样做

takeWhileRight (x:xs) = do
  y <- x
  case y of
      Right -> (y:) <$> takeWhileRight xs
      Left  -> pure []
takeWhileRight [] = pure  []
takeWhileRight(x:xs)=do
y(y:)带上whilerRight xs
左->纯[]
takeWhileRight[]=纯[]
(未经测试。)

请注意,仍需运行第一个IO操作,该操作将给出一个左
。这是不可避免的