如何在Haskell中通过递归(树)求值传递参数

如何在Haskell中通过递归(树)求值传递参数,haskell,recursion,Haskell,Recursion,我正在编写一个函数,它接受一个复合交互,并通过查找原语值递归地执行它。它基本上是一种树(我想)。但是,它需要跟踪在执行此操作时检查的最后两个基本值。在非函数式语言中,我可以只使用全局变量,但我不确定如何在Haskell中管理它 也许我可以通过一个实验列表,让它返回(Inter,experience),然后把它添加到下面标记的地方?为了不搞砸(Composite pre(acture post)),我会在前一行中得到调用,并且只使用Inter值。。。太好了,把它打出来我可能发现了一些复杂的东西。然

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

也许我可以通过一个实验列表,让它返回(Inter,experience),然后把它添加到下面标记的地方?为了不搞砸(Composite pre(acture post)),我会在前一行中得到调用,并且只使用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

我看不到代码的其余部分,因此无法编写其余部分。下面是如何在
执行
计算树的分支时传递“全局状态”的想法:

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
data Inter e r=None |原语e r
|复合材料(内部e r)(内部e r)
派生(显示、读取、等式、Ord)
颁布::(Eq e,Eq r)=>Inter e r->State a(Inter e r)
颁布(综合前置后置)=执行

您应该包括所有必要的
import
语句。import Control.Monad.State非常感谢!这正是我想知道的。多亏了你,学会在实践中使用状态并没有那么困难,它就像一个符咒。(e和r很好。总是想知道如何衡量描述性和简明的名称。不过我也应该包括这些。对不起。)