takeWhile 用于无限 IO 列表
takeWhile for an infinite IO list
我正在尝试使用可能包含以下类型元素的无限列表:
IO (Either Throwable a)
- 我只对消费
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
关于如何正确使用该列表的任何想法?
是的,这不适用于 sequence
你需要做类似的事情
takeWhileRight (x:xs) = do
y <- x
case y of
Right -> (y:) <$> takeWhileRight xs
Left -> pure []
takeWhileRight [] = pure []
(未测试。)
请注意,第一个给出 Left
的 IO 操作仍然必须是 运行。这是不可避免的。
我正在尝试使用可能包含以下类型元素的无限列表:
IO (Either Throwable a)
- 我只对消费
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
关于如何正确使用该列表的任何想法?
是的,这不适用于 sequence
你需要做类似的事情
takeWhileRight (x:xs) = do
y <- x
case y of
Right -> (y:) <$> takeWhileRight xs
Left -> pure []
takeWhileRight [] = pure []
(未测试。)
请注意,第一个给出 Left
的 IO 操作仍然必须是 运行。这是不可避免的。