我是Haskell的新手(仍在努力完全理解monads).我有一个问题,我有一个树状的结构
type Tree = [DataA]
data DataA = DataA1 [DataB]
| DataA2 String
| DataA3 String [DataA]
deriving Show
data DataB = DataB1 [DataA]
| DataB2 String
| DataB3 String [DataB]
deriving Show
Run Code Online (Sandbox Code Playgroud)
我想要做的是能够遍历这个并生成一个带过滤器的新树.例如,我可能想要将树中的所有DataB2更改为"foo".
我已经看到了树在同一数据部分中的示例,并且构造函数是相似的.
在python世界中,我只是遍历列表,匹配我需要的任何东西,并替换值.
在Haskell中我猜我需要能够复制我的树,但是你如何处理隐藏在构造函数和不同数据类型中的列表?
我有一个列表,我需要解析除了最后一个元素之外的所有元素需要由一个解析器解析,最后一个元素需要由另一个解析器解析.
a = "p1 p1b ... p2"
or
a = "p2"
Run Code Online (Sandbox Code Playgroud)
本来我试过
parser = do parse1 <- many parser1
parse2 <- parser2
return AParse parse1 parse2
Run Code Online (Sandbox Code Playgroud)
问题是parse1可以使用parse2输入.所以parse1总是占用整个列表,并且没有任何东西留下parse2.
有没有办法说将parse1应用到除字符串中最后一个元素之外的所有内容,然后应用parse2?
我是Haskell的新手,所以我想弄清楚如何进行树遍历.
以下是我在几篇论文中看到的公司示例(略有变化)
data Company = C [Dept] deriving (Eq, Show, Typeable, Data)
data Dept = D Name Manager [Unit] deriving (Eq, Show, Typeable, Data)
data ThinkTank= TK Name [Unit] deriving (Eq, Show, Typeable, Data)
data Unit = PU Employee | DU Dept deriving (Eq, Show, Typeable, Data)
data Employee = E Person Salary deriving (Eq, Show, Typeable, Data)
data Person = P Name Address deriving (Eq, Show, Typeable, Data)
data Salary = S Float deriving (Eq, Show, Typeable, Data)
type …
Run Code Online (Sandbox Code Playgroud)