takeWhile 用于无限 IO 列表

takeWhile for an infinite IO list

我正在尝试使用可能包含以下类型元素的无限列表:

IO (Either Throwable a)

问题是我使用的实现是错误的,因为函数 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

关于如何正确使用该列表的任何想法?

是的,这不适用于 sequence

你需要做类似的事情

takeWhileRight (x:xs) = do
  y <- x
  case y of
      Right -> (y:) <$> takeWhileRight xs
      Left  -> pure []
takeWhileRight [] = pure  []

(未测试。)

请注意,第一个给出 Left 的 IO 操作仍然必须是 运行。这是不可避免的。