如何通过Haskell中的递归(树)评估传递参数

时间:2014-11-17 21:17:40

标签: haskell recursion

我正在编写一个函数,它接受复合交互,并通过查找原始值来递归地实现它。它基本上是一种树(我想)。但是,它需要跟踪它在执行此操作时检查的最后2个原始值。在非函数式语言中,我可以使用全局变量,但我不确定如何在Haskell中管理它。

也许我可以通过一系列实验并让它返回(Inter,Experiment),然后将其添加到下面标记的位置?为了不弄乱(复合前(发布帖子)),我会在前一行中得到调用并且只使用Inter值。 ...很好,输入它我可能发现了一些复杂的东西。但是,如果有更优雅的方式来解决这个问题,我会很感激。

data Inter = None | Primitive Experiment Result | Composite Inter Inter deriving (Show, Read, Eq, Ord)

enact :: Inter -> Inter
enact (Composite pre post) =
    let enacted = enact pre
    -- add to eHist here, pass it on. Reconstruct it after you finish?
    in if enacted /= pre
        then enacted
        else (Composite pre (enact post))
enact (Primitive e _) = (Primitive e (getResult10 e))
enact None = None

-- Environment040
getResult40 :: [Experiment] -> Experiment -> Result
getResult40 (pre:pen:_) cur
    | pen /= cur && pre == cur = R2
    | otherwise = R1

1 个答案:

答案 0 :(得分:0)

我看不到你的其余代码,所以无法组成余数。以下是在enact计算树的分支时如何传递“全局状态”的想法:

data Inter e r = None | Primitive e r
                      | Composite (Inter e r) (Inter e r)
                      deriving (Show, Read, Eq, Ord)
enact :: (Eq e, Eq r) => Inter e r -> State a (Inter e r)
enact (Composite pre post) = do
      enacted <- enact pre
      x <- get -- and then you can use x, if enact depends on the last
               -- two Primitives seen
      if enacted /= pre
      then return enacted
      else do
             post' <- enact post
             return $ Composite pre post'
enact (Primitive e r) = do
          x <- get
          put $ modify x somehow -- you wanted to keep track of
                                 -- the last two Primitives
          return $ Primitive e r
enact None = return None

我必须用er替换类型,以确保它编译;而且,说实话,我不会错过它。现在,您可以使用getput来查询状态(类型a,但您可能更具体 - 例如您正在考虑的过去原始值的元组),以及设置为在树步行中进一步评估使用。然后,您可以使用runStateevalState来提供初始状态(例如,表示尚未找到原始值的初始元组),然后返回Inters树或树和最终状态。