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操作,该操作将给出一个左
。这是不可避免的