在Haskell中定义数据类型

在Haskell中定义数据类型,haskell,types,Haskell,Types,在编程语言类中,Haskell赋值(创建基本语言W)的数据类型如下: data WValue = VInt Int | VBool Bool deriving (Eq, Show) data WExp = Val WValue | Var String | Plus WExp WExp | Minus WExp WExp | Multiplies WExp WExp | Divides WExp

在编程语言类中,Haskell赋值(创建基本语言
W
)的数据类型如下:

data WValue = VInt Int 
        | VBool Bool 
          deriving (Eq, Show)

data WExp = Val WValue
      | Var String
      | Plus WExp WExp
      | Minus WExp WExp
      | Multiplies WExp WExp
      | Divides WExp WExp
      | Equals WExp WExp
      | NotEqual WExp WExp
      | Less WExp WExp
      | Greater WExp WExp
      | LessOrEqual WExp WExp
      | GreaterOrEqual WExp WExp
      | And WExp WExp
      | Or WExp WExp
      | Not WExp

data WStmt = Empty
       | VarDecl String WExp
       | Assign String WExp
       | If WExp WStmt WStmt
       | While WExp WStmt
       | Block [WStmt]

我的问题——可能很愚蠢——是我是否需要为所有数据类型定义所有值构造函数,或者,例如,是否定义处于最高级别的数据类型(
WStmt
,在本例中),足以使其余数据类型以某种隐式方式工作。

您需要为每个相应的数据类型定义所有值构造函数。我不太明白你的意思。也许您可以展示一个伪代码示例,说明您认为需要做什么?给定的代码似乎正在工作。你所说的工作是什么意思?这段代码所做的只是为每种数据类型声明选项,而没有定义它们,我错了吗?所以,即使它“起作用”,它实际上还没有做任何事情。我不确定你在这里区分声明和定义是什么意思。是的,它不做任何事情(除了Haskell:-P中的
main::IO()
之外没有其他代码),但是数据类型和构造函数已经准备好使用(例如,为它们定义
Show
Read
实例).你不需要定义一个
类型
它已经有了由其声明定义的行为。我怀疑你希望编译器读懂你的心思-显然你必须写下每个数据类型是什么。数据类型声明正是这样做的。您可以包含一些伪代码及其预期行为吗?对于编写这些数据声明,您特别不喜欢什么?