【问题标题】:Couldn't match expected type when folding binary trees折叠二叉树时无法匹配预期类型
【发布时间】:2021-09-17 15:55:06
【问题描述】:
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 

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

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

  • 无法匹配预期类型:[Char] 实际类型:BB a0 -> a0 -> BB a0 -> BB a0
    • 可能原因:K' is applied to too few arguments In the second argument of foldrpBB',即`K' 在表达式中: 折叠rpBB (\ x xs -> concat ["(", 显示 x, xs, ....]) K (K L 2 L) 1 (K (K L 4 L) 3 L)

我该如何解决这个问题?

【问题讨论】:

    标签: haskell types binary-tree fold infix-notation


    【解决方案1】:

    你犯了两个不同的错误。首先,您在调用函数时忘记了基本情况 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))

    【讨论】:

    • 非常感谢! - 我对 Haskell 和一般的编码还很陌生,所以非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多