Programming languages 此编程语言功能的名称是什么?是否有支持它的真实语言?

Programming languages 此编程语言功能的名称是什么?是否有支持它的真实语言?,programming-languages,pseudocode,language-theory,Programming Languages,Pseudocode,Language Theory,将树数据结构定义为: 树有一个节点作为其根。节点可以是叶节点,也可以是内部节点,其中有一个或多个节点作为其子节点 在某种伪OO编程语言中,我们可以定义如下树: Node := InnerNode | Leaf Leaf { isLeaf() : TRUE } InnerNode { isLeaf() : FALSE children() : List<Node> } Tree { root() : Node } Node:=InnerN

将树数据结构定义为:

树有一个节点作为其根。节点可以是叶节点,也可以是内部节点,其中有一个或多个节点作为其子节点

在某种伪OO编程语言中,我们可以定义如下树:

Node := InnerNode | Leaf

Leaf {

    isLeaf() : TRUE

}

InnerNode {

    isLeaf() : FALSE
    children() : List<Node>

}

Tree {
    root() : Node
}
Node:=InnerNode | Leaf
叶子{
isLeaf():TRUE
}
内节点{
isLeaf():FALSE
children():列表
}
树{
root():节点
}
现在我们可以定义两个函数,“bad_code”和“good_code”。函数“bad_code”未编译,另一个函数执行以下操作:

function bad_code(Node anyNode) : void {

    // this will give a compile time error "type Node does not define method children()"
    anyNode.children();
}

function good_code(Node anyNode) : void {

    // the compiler understands that all Nodes must have a method called isLeaf() which 
    // returns a boolean
    let b : boolean <- anyNode.isLeaf();

    if (b == FALSE) {

        // this will not give a compile time error because the compiler can deduce that 
        // anyNode must be of type InnerNode which has the method children()
        anyNode.children();
    }
}
功能错误\u代码(Node anyNode):无效{
//这将导致编译时错误“类型节点未定义方法子项()
anyNode.children();
}
功能良好\u代码(节点任意节点):无效{
//编译器知道所有节点都必须有一个名为isLeaf()的方法
//返回一个布尔值

让b:boolean您所描述的是编译器使用控制流图来缩小变量的类型,这样当
if
语句测试与变量类型相关的条件时,可以为
if
语句体推断出同一变量的更具体类型

这称为控制流类型缩小,它是在例如中完成的。它纯粹是一个静态检查,在编译时完成,没有运行时惩罚;事实上,Typescript中的类型在运行时根本不可用

type TreeNode=InnerNode | Leaf
接口叶{
岛:对
}
接口内部节点{
岛:假
子节点:节点[]
}
函数错误代码(anyNode:TreeNode):void{
//类型错误:类型“TreeNode”上不存在属性“children”。
log(anyNode.children);
}
函数良好\u代码(任意节点:TreeNode):无效{
如果(!anyNode.isLeaf){
//将类型缩小为anyNode:InnerNode
log(anyNode.children);
}
}
请注意,Typescript要求您以特定的方式执行此操作;我们直接测试
anyNode.isLeaf
,而不是首先将其存储在变量
b:boolean
中,因为Typescript不跟踪两个变量
b
anyNode
之间的关系:

类型脚本中的函数错误(anyNode:TreeNode):无效{
设b:boolean=anyNode.isLeaf;
如果(!b){
//类型错误:类型“TreeNode”上不存在属性“children”。
log(anyNode.children);
}
}
此外,在上面的代码中,isLeaf
是一个属性而不是一个方法。Typescript确实有一个称为用户定义类型保护的相关功能,该功能允许方法的返回类型类似于
这是Leaf
,这表明只有在调用类型为
Leaf
的对象时,该方法才会返回
true

type TreeNode=InnerNode | Leaf
接口基节点{
ifLeaf():这是Leaf
isInner():这是InnerNode
}
接口叶扩展BaseNode{}
接口InnerNode扩展了BaseNode{
子节点():节点[]
}
但是,Typescript仍然比您的示例有一点限制;我们必须测试
anyNode.isInner()
,因为
!anyNode.isLeaf()
不一定会进行同样的缩小。(Typescript使用结构类型,因此实际上此
Leaf
InnerNode
的超类型,这会导致联合类型出现一些问题。如果给
Leaf
一个
value:number
这样的属性,而
InnerNode
没有,那么
!anyNode.isLeaf()
的工作方式与您预期的一样。)


对于模式匹配和代数数据类型所做的工作来说,这是一种非常详细的语法。