Haskell中的构造函数

Ben*_*sen 0 haskell abstract-syntax-tree

这是家庭作业的摘录."Prog此数据类型应该只有一个构造函数,并用于表示窗体的程序:

read vin1 ; read vin2 ; < some statements > write vout2 ;
Run Code Online (Sandbox Code Playgroud)

这个构造函数也可以命名为Prog,它接受一个字符串作为两个输入和一个输出变量的名称."

将expProg定义为Prog类型,并将其作为上面左侧程序的抽象语法表示.这应该做如下:

expProg = Prog "x" "y" <some statements> "z"
Run Code Online (Sandbox Code Playgroud)

我是Haskell的新手,对此感到困惑.

我做了这样的构造函数.然而,这似乎不对.

data Prog = Prog String String String 
  deriving (Show,Eq)
Run Code Online (Sandbox Code Playgroud)

谁能解释一下这里发生了什么?我不明白如何制作这个构造函数.这是我为语句做的数据类型:

 data Stmt = Assing String Expr
      | WhileLoop Expr Stmt
      | Ifthen Expr Stmt
      | IfthenElse Expr Stmt Stmt
      | Composition [Stmt]
Run Code Online (Sandbox Code Playgroud)

dfl*_*str 6

你说你需要在构造函数中包含"some statements".目前,您只有两个输入变量和输出变量的空间.只需为语句添加另一个字段,例如:

data Prog = Prog String String Stmt String
--                                  ^ output variable
--                             ^ some statements
--                       ^ input variable 2
--               ^ input variable 1
Run Code Online (Sandbox Code Playgroud)

Now you can use it like so:

expProg = Prog "x" "y" (Composition [Assing "x" (...some expression...),
                                     Assing "z" (...some expression...)])  "z"
Run Code Online (Sandbox Code Playgroud)

(Note that it's actually spelled Assign, not Assing)