尝试在Haskell中反转二叉树

尝试在Haskell中反转二叉树,haskell,functional-programming,Haskell,Functional Programming,我最近开始学习函数式编程,刚刚开始学习Haskell。我正在尝试反转二叉树,到目前为止,我有以下几点: data Tree a = Tip | Bin (Tree a) a (Tree a) deriving (Show,Eq) mirror :: Tree a -> Tree a mirror(Bin l v r) = (mirror r) Bin v (mirror l) 但是,我不太明白为什么会出现以下错误:无法匹配预期的类型“treea0->a0->treea0->treea

我最近开始学习函数式编程,刚刚开始学习Haskell。我正在尝试反转二叉树,到目前为止,我有以下几点:

data Tree a = Tip | Bin (Tree a) a (Tree a) deriving (Show,Eq)

mirror :: Tree a -> Tree a
mirror(Bin l v r) = (mirror r) Bin v (mirror l) 

但是,我不太明白为什么会出现以下错误:无法匹配预期的类型“treea0->a0->treea0->treea0->treea0”。有人能解释一下我在哪里感到困惑吗?

您需要将数据构造函数放在第一位,因此它应该是:

mirror :: Tree a -> Tree a
mirror(Bin l v r) = Bin (mirror r) v (mirror l) 
通过使用mirror Bin v mirror l,可以调用Bin作为mirror结果的参数,因此mirror Bin。但这没有多大意义


请注意,您还需要为Tip添加一个案例,因为现在,您的函数并没有覆盖所有可能的值。

您需要将数据构造函数放在这里的第一位,因此它应该是:

mirror :: Tree a -> Tree a
mirror(Bin l v r) = Bin (mirror r) v (mirror l) 
通过使用mirror Bin v mirror l,可以调用Bin作为mirror结果的参数,因此mirror Bin。但这没有多大意义


请注意,您还需要为Tip添加一个案例,因为现在,您的函数并没有涵盖所有可能的值。

非常感谢,我在理解函数编程的基本原理时遇到了一些困难。至于基本情况,我写了以下内容:mirror@eTip=e.@CarlosRomero一个等价的公式是mirror-Tip=Tip。我只会使用e@Tip构造更长的表达式,但是如果你喜欢这里,它没有什么问题。非常感谢,我在理解函数式编程的基础知识时遇到了一些麻烦。至于基本情况,我写了以下内容:mirror@eTip=e.@CarlosRomero一个等价的公式是mirror-Tip=Tip。我只会使用e@Tip构造更长的表达式,但如果您喜欢这里,它没有什么问题。