【问题标题】:takeWhile for an infinite IO listtakeWhile 用于无限 IO 列表
【发布时间】:2015-12-13 11:09:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: functional-programming frege


    【解决方案1】:

    是的,这不适用于sequence

    你需要做类似的事情

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

    (未经测试。)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-25
      • 2015-06-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2011-12-05
      相关资源
      最近更新 更多