是否存在将单个转换应​​用于无限元素流的双重模式?

时间:2014-09-27 21:16:34

标签: scala functional-programming

将变换流应用于单个不可变元素/状态。应用仿函数做这样的事情但是有限的功能。它允许您在一个单独的上下文中执行它们,在这种情况下您可以收集错误并让它以失败的状态完成...例如,我对更完整的事情感兴趣。

示例可能是IDE编辑器:应用于编辑器状态的无限转换流。

除了明显的foldLeft / scanLeft与[A => B]元素

1 个答案:

答案 0 :(得分:3)

  

将单个转换应​​用于无限的元素流

是地图。

 map f [1..]
  

将转换流应用于单个不可变元素/状态

仍然是地图:)

 map (`apply` x) [f, g, h ..]

其中

 f `apply` x = f x

并且行动的顺序更加丰富。并且您可能拥有自定义apply功能,其功能不仅仅是功能应用程序。并且可能存在一些累积状态,因此它是一个地图和一个折叠。具有丰富的传入流语义。

这是一名"翻译"图案。

  • 你有一个(可能是无限的)"程序" - 你的行动。
  • 您有一个评估功能 - 您应用于每个功能的功能 动作。
  • 你有一个环境/堆/状态或其他上下文 评估每个行动。

所以你首先要定义可能的行动:

   data Exp
          = Action1
          | Action2 Int Bool
          | Action3 ...

和一个解释每个动作的评估者,有一些状态:

   eval :: State -> Exp -> IO (State, Either Error Result)
   eval st Action1       = .. do something ..
   eval st (Action2 x b) = .. do something else

然后最后在循环中运行它。您的行动map

   go :: State -> [Exp] -> IO ()
   go st (act:acts) = do
             (st', er) <- eval st act
             case er of
                 Error x -> .. fail ?
                 Result y -> .. success
             go st' acts

你正在路上。