代码之家  ›  专栏  ›  技术社区  ›  Bob T

Haskell嵌套代数数据类型

  •  2
  • Bob T  · 技术社区  · 7 年前

    我试图在Haskell中对以下简单的Scala ADT进行建模:

    sealed trait Value
    
    sealed trait Literal < Value
    case object Null extends Literal
    case class IntLiteral(value: Int) extends Literal
    
    case class Variable(name: String) < Value
    

    我为 Literal

    Prelude> data Literal = Null | IntLiteral Int deriving (Show, Eq)
    

    Prelude> Null
    Null
    Prelude> Null == IntLiteral 3
    False
    Prelude> IntLiteral 3 == IntLiteral 3
    True
    

    现在我试着介绍一下 Variable :

    data Value = Literal | Variable String deriving (Show, Eq)
    

    Prelude> Null == Variable "foo"
    
    <interactive>:3:9: error:
        • Couldn't match expected type ‘Literal’ with actual type ‘Value’
        • In the second argument of ‘(==)’, namely ‘Variable "foo"’
          In the expression: Null == Variable "foo"
          In an equation for ‘it’: it = Null == Variable "foo"
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Will Ness Derri Leahy    7 年前

    Null 属于类型 Literal , Variable "foo" 属于类型 Value 字面意义的 ,与同名类型无关。在哈斯克尔,这些只是不同的东西,生活在不同的名称空间中。如果你写信

    data Value = Literal Literal | ...
    

    字面意义的 是数据构造函数的名称(创建类型为的值) 价值 ,在这种情况下),第二个是类型的名称。