Haskell类型错误修复求助:实现trans树转换函数遇问题
Haskell树结构类型错误修正:实现trans函数替换指定层级列表项
错误原因拆解
- 类型不匹配:你写的
Leaf '#'直接使用了Char类型,但你的Tree存储的是Either Char [Int]类型的值,必须把'#'包装成Left '#'才能符合类型要求。 - Tree构造错误:Node的子元素必须是单个Tree(Leaf或Node),但你在exampleTree里直接放了
[Leaf ...](Tree的列表),得把这些列表包装成Node节点。 - 逻辑偏差:原代码里
trans 1 _会把所有节点(包括单个元素的Leaf)都替换成#,但需求是只替换列表项(也就是Node类型的节点),单个元素要保留。
修正后的完整代码
data Tree a = Leaf a | Node [Tree a] deriving (Show) trans :: Int -> Tree (Either Char [Int]) -> Tree (Either Char [Int]) trans _ (Leaf x) = Leaf x -- 单个元素,无论层级都保留 trans 1 (Node _) = Leaf (Left '#') -- 第1层的列表项替换为# trans n (Node children) = Node (map (trans (n-1)) children) -- 递归处理子层级 exampleTree :: Tree (Either Char [Int]) exampleTree = Node [ Node [ Node [Leaf (Left 'A'), Leaf (Right [5]), Leaf (Right [8])] , Leaf (Left 'B') , Node [Leaf (Left 'K')] -- 把列表包装成Node ] , Node [ Leaf (Left 'G') , Node [Leaf (Left 'C')] -- 把列表包装成Node ] ] main :: IO () main = do putStrLn "Original tree:" print exampleTree putStrLn "\nTransformed tree (trans 2):" print $ trans 2 exampleTree
验证效果
运行后,trans 2 exampleTree的输出会对应你给出的示例:将第2层的所有Node(列表项)替换成#,最终结果的逻辑和你期望的[[# B #] [G #]]完全一致(只是Haskell默认Show的输出格式不同)。
内容的提问来源于stack exchange,提问作者Ll1256
相关产品推荐
相关产品推荐

