2

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

IO (Either Throwable a)

  • 我只对使用 type 的元素感兴趣Right
  • 列表已排序。Right元素总是在前,然后是Left元素

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

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

4

1 回答 1

2

是的,这不适用于sequence

你需要做类似的事情

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

(未经测试。)

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

于 2015-12-13T14:04:47.807 回答