我正在编写一个函数,它接受复合交互,并通过查找原始值来递归地实现它。它基本上是一种树(我想)。但是,它需要跟踪它在执行此操作时检查的最后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
答案 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
我必须用e
和r
替换类型,以确保它编译;而且,说实话,我不会错过它。现在,您可以使用get
和put
来查询状态(类型a
,但您可能更具体 - 例如您正在考虑的过去原始值的元组),以及设置为在树步行中进一步评估使用。然后,您可以使用runState
或evalState
来提供初始状态(例如,表示尚未找到原始值的初始元组),然后返回Inters
树或树和最终状态。