Haskell 函数来度量二叉树的大小
当我尝试Haskell 函数来度量二叉树的大小,haskell,pattern-matching,syntax-error,binary-tree,Haskell,Pattern Matching,Syntax Error,Binary Tree,当我尝试size(na(left a)(right a))而不是size(na left right)时,ghci告诉我,当定义发生冲突时,这一行发生冲突。我不知道为什么,因为在我的数据签名中,它是na(树a)(树a)size是一个计算bin树中节点数的函数 data Tree a = Nil | N a (Tree a) (Tree a) deriving (Show, Read, Eq) size :: Tree Int -> Int size Nil = 0 size (N _
size(na(left a)(right a))
而不是size(na left right)
时,ghci告诉我,当定义发生冲突时,这一行发生冲突。我不知道为什么,因为在我的数据签名中,它是na(树a)(树a)
size
是一个计算bin树中节点数的函数
data Tree a = Nil | N a (Tree a) (Tree a) deriving (Show, Read, Eq)
size :: Tree Int -> Int
size Nil = 0
size (N _ left right) = 1 + size left + size right
当我尝试调整大小(NA(左a)(右a))而不是调整大小(NA左右)
在本例中,left
和right
是类型为Tree Int
的表达式
a
在此上下文中不是已知的变量或类型
如果定义更新为size(N a左-右)
,则a
是Int
类型的绑定表达式
当我尝试调整大小(NA(左a)(右a))而不是调整大小(NA左右)
在本例中,left
和right
是类型为Tree Int
的表达式
a
在此上下文中不是已知的变量或类型
如果定义更新为
size(N a left right)
,则a
是Int
类型的绑定表达式。为了帮助您了解发生了什么,您可以编写匹配的内部节点来命名左、右子树及其各自的值
size (N _ left@(N a _ _) right@(N b _ _)) = 1 + size left + size right
描述at符号的情况,它允许程序员命名左子树和右子树
表单的模式<代码>var@pat被称为模式,允许使用var作为pat匹配的值的名称
由于许多原因,这种宽泛的方法是不雅观的
树
代数数据类型的声明,左
和右
已被约束为树
类型Nil
参数定义size
的其他三种情况数据定义的构造函数,取决于值:
- 如果值的形式为conv1…vn,则子模式与数据值的组件从左到右匹配;如果所有比赛都成功,则整个比赛成功;第一个失败或偏离分别导致整个比赛失败或偏离
- 如果值的形式为con′v1…vn,其中con是与con′不同的构造函数,则匹配失败
- 如果值为⊥, 比赛有分歧
第一个问题是,通过将左、右子树绑定到变量,您希望如何实现它,以及如何在问题中编写它。您的第一次尝试看起来有点像绑定到构造函数,这就是为什么会出现语法错误
Haskell模式匹配可以更复杂,例如。对于学习练习,首先要掌握基本知识。为了帮助您了解发生了什么,您可以编写匹配内部节点来命名左、右子树及其各自的值
size (N _ left@(N a _ _) right@(N b _ _)) = 1 + size left + size right
描述at符号的情况,它允许程序员命名左子树和右子树
表单的模式<代码>var@pat
被称为模式,允许使用var作为pat匹配的值的名称
由于许多原因,这种宽泛的方法是不雅观的
树
代数数据类型的声明,左
和右
已被约束为树
类型Nil
参数定义size
的其他三种情况数据定义的构造函数,取决于值:
- 如果值的形式为conv1…vn,则子模式与数据值的组件从左到右匹配;如果所有比赛都成功,则整个比赛成功;第一个失败或偏离分别导致整个比赛失败或偏离
- 如果值的形式为con′v1…vn,其中con是与con′不同的构造函数,则匹配失败
- 如果值为⊥, 比赛有分歧
第一个问题是,通过将左、右子树绑定到变量,您希望如何实现它,以及如何在问题中编写它。您的第一次尝试看起来有点像绑定到构造函数,这就是为什么会出现语法错误
Haskell模式匹配可以更复杂,例如。对于学习练习,首先要掌握基础知识。(N左-右)
是一种模式<代码>(NA(左a)(右a))
也应该是一个模式,但它是一个无效的模式,Haskell说,不是你说的那样。您不需要在模式中提及类型,只需使用变量来命名数据类型的相应组成部分。为什么您将大小限制为仅处理树Int
?它应该能够在包含任何类型的树上工作。也就是说,size::Tree a->Int
(N左-右)
是一种模式<代码>(NA(左a)(右a))
也应该是一个模式,但它是一个无效的模式,Haskell说,不是你说的那样。您不需要在模式中提及类型,只需使用一个变量来命名对应的组件