折叠二叉树时无法匹配预期类型

Couldn't match expected type when folding binary trees

data BB a = L | K (BB a) a (BB a) deriving (Show)
foldrpBB :: (a -> b -> b) -> b -> BB a -> b 
foldrpBB f b L = b 
foldrpBB f b (K l r a) = foldrpBB f (f r (foldrpBB f b a)) l
foldrprBB :: (a -> b -> b) -> b -> BB a -> b 
foldrprBB f b L = b 
foldrprBB f b (K a l r) = foldrprBB f (f l (foldrpBB f b r)) a 

我正在尝试创建两个不同的折叠函数,它们将打印 post- 和给定二叉树的中缀表达式,例如 K (K L 2 L) 1 (K (K L 4 L) 3 L ) 与匿名函数结合使用时 (\x xs -> concat ["(", show x, xs, ")"]).

我收到一个错误,基本上告诉我我的函数需要一个字符串,但它应该需要一个函数和一个二叉树 (BB):

我该如何解决这个问题?

你犯了两个不同的错误。首先,您在调用该函数时忘记了基本情况 b 参数。我假设您希望它是 ""。其次,您需要在要折叠的结构中使用括号或 $。您将从以下两个固定表达式中的任何一个得到 "(2(1(4(3))))"

  • foldrpBB (\x xs -> concat ["(", show x, xs, ")"]) "" $ K (K L 2 L) 1 (K (K L 4 L) 3 L)
  • foldrpBB (\x xs -> concat ["(", show x, xs, ")"]) "" (K (K L 2 L) 1 (K (K L 4 L) 3 L))