我有一个树和插入操作,就像“学习Haskell实现伟大的好处!”| x < a = Node a (treeInsert x left) right 我想使用StateMonad重新实现treeInsert,但我甚至不确定函数声明应该是什么样子。到目前为止,我有这样的想法:
treeInsert :: (Ord a) => a -> Tree a -> Sta
例如,L a = Empty | Cons a L通常称为“列表”,而T a = Leaf a | Node (T a) (T a)是“二叉树”,St s a :: St (s->(a,s))是StateMonad的形式。递归函数让它看起来有点像StateMonad或Cont Monad。除了(->)和(>=>)之外,它也是唯一一个我见过为其定义了箭头实例的结构。
这个数据结构有没有通用的名字?
我的问题涉及将树转换为其表示时的明显笨拙,这需要显式引用节点名称以插入更多节点/边。具体地说,我递归地构建了一棵玫瑰树(目前是containers的Data.Tree.Tree a ),并希望将其转换为Gr a (),以便针对它调用各种函数。为此,可以首先遍历树(使用supply monad或FGL的状态monad类型之一,如NodeMapM),并使用标识符标记每个节点:impo
我一直在一点一点地学习一些Haskell,并且(慢慢地)致力于理解Statemonad,尝试编写一个函数来重复State计算,直到状态满足一些布尔测试,并收集列表中的返回值以获得整体结果。我最终做到了这一点:collectUntil f s = do s0 <- getif (f s') then return [a] else liftM (a:) $ c
我最近决定开始使用monad转换,而不是堆叠我的monad,因为这似乎是正确的做法。不管怎么说,我以前并没有堆叠很多单子。假设我有一个定制的monad,m,并且我对它使用了一个StateT转换,因此使用StateT s m a类型而不是m (State s a)。因此,我正在构建一个类似于这样的递归函数recFunc :: State s a -> [t] -> m (State s a):
recFunc ::