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
    的其他三种情况
  • 概述了该语言如何处理模式的案例。在这个问题的背景下,你需要特别注意的是

    一,。将模式var与值v匹配总是成功的,并将var绑定到v

    五,。将模式con pat1…patn与值匹配,其中con是由
    数据定义的构造函数,取决于值:

    • 如果值的形式为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
    的其他三种情况
  • 概述了该语言如何处理模式的案例。在这个问题的背景下,你需要特别注意的是

    一,。将模式var与值v匹配总是成功的,并将var绑定到v

    五,。将模式con pat1…patn与值匹配,其中con是由
    数据定义的构造函数,取决于值:

    • 如果值的形式为conv1…vn,则子模式与数据值的组件从左到右匹配;如果所有比赛都成功,则整个比赛成功;第一个失败或偏离分别导致整个比赛失败或偏离
    • 如果值的形式为con′v1…vn,其中con是与con′不同的构造函数,则匹配失败
    • 如果值为⊥, 比赛有分歧
    第一个问题是,通过将左、右子树绑定到变量,您希望如何实现它,以及如何在问题中编写它。您的第一次尝试看起来有点像绑定到构造函数,这就是为什么会出现语法错误


    Haskell模式匹配可以更复杂,例如。对于学习练习,首先要掌握基础知识。

    (N左-右)
    是一种模式<代码>(NA(左a)(右a))
    也应该是一个模式,但它是一个无效的模式,Haskell说,不是你说的那样。您不需要在模式中提及类型,只需使用变量来命名数据类型的相应组成部分。为什么您将
    大小限制为仅处理
    树Int
    ?它应该能够在包含任何类型的
    树上工作。也就是说,
    size::Tree a->Int
    (N左-右)
    是一种模式<代码>(NA(左a)(右a))
    也应该是一个模式,但它是一个无效的模式,Haskell说,不是你说的那样。您不需要在模式中提及类型,只需使用一个变量来命名对应的组件