我想写一个haskell程序来实现一种基于其指称语义的简单命令式语言。我在 Windows 上使用 GHCi,版本 8.4.2。我在实现下面描述的函数和过程抽象时遇到了一些问题。
让我描述一下。我称之为 IMP。首先,我定义了抽象语法。IMP 只接受整数。和标识符将是字符串。
type Numeral = Int
type Ident = String
data Command =
Skip
| Assign (Ident, Expression)
| Letin (Declaration, Command )
| Cmdcmd (Command, Command )
| Ifthen (Expression, Command, Command)
| Whiledo (Expression, Command )
| IdentifierC ( ActualParameter )
data Expression =
Num Numeral
| False_
| True_
| Notexp Expression
| Id Ident
| Sumof (Expression, Expression)
| Subof (Expression, Expression)
| Prodof (Expression, Expression)
| Less (Expression, Expression)
| Leten (Declaration, Expression)
| IdentifierE ( ActualParameter )
deriving Show
type ActualParameter = Expression
data FormalParameter = Constfp Identifier
data Declaration =
Constdef (Ident, Expression)
| Vardef (Ident, TypeDef )
| Func Identifier ( FormalParameter ) ~ Expression
| Proce Identifier ( FormalParameter ) ~ Command
deriving Show
data TypeDef =
Bool | Int
deriving Show
简要说明:在 Command 中,Skip 什么都不做。分配会将表达式的值赋予标识。Letin 将在命令中声明一些变量。Cmdcmd 将依次运行 2 个命令。ifthen 是条件命令,如果第一个表达式被评估为真,则运行第一个命令,否则运行第二个命令。Whiledo 是循环。IdentifierC ( ActualParameter ):IdentifierC 表示本地环境中的某些功能。这个 ActualParameter 是一些带有一些值的表达式。这个命令只是在指定的值上调用这个函数。
在Expression中,从上到下依次是: numeric bool false bool true negate of expression 从本地环境中获取Ident的值。sum 2 个表达式减去 2 个表达式的乘积 2 < 在表达式中声明某个变量 IdentifierE ( ActualParameter ) IdentifierE 表示本地环境中的某个函数。这个 ActualParameter 是一些带有一些值的表达式。这个命令只是在指定的值上调用这个函数。最后得到一个新值作为这个表达式的结果。
然后是语义域
type Integer = Int
type Boolean = Bool
type Location = Int
type Function = Argument -> Store -> Value
type Procedure = Argument -> Store -> Store
-- store would be snapshot of the memory.
data Value = IntValue Int
| TruthValue Bool
deriving (Eq, Show)
-- first class value only are int and bool
type Storable = Value
data Bindable = Const Value
| Variable Location
| Function Func
| Procedure Proce
deriving (Eq, Show)
data Denotable = Unbound | Bound Bindable
deriving (Eq, Show)
type Argument = Value
data Sval = Stored Storable | Undef | Unused
-- The actual storage in a Store
type DataStore = Location -> Sval
-- --bot--- --top--- --data---
data Store = Store (Location, Location, DataStore)
type Environ = Ident -> Denotable
-- ---------- Semantic Functions -------------- --
valuation :: Int -> Value
evaluate :: Expression -> Environ -> Store -> Value
elaborate :: Declaration -> Environ -> Store -> (Environ,Store)
execute :: Command -> Environ -> Store -> Store
-- the main goal is to define these semantic functions
-- I give some examples in my source code below.
我的代码在这里:https ://github.com/sanyuwen/IMP/blob/master/DSemImp.hs 。我的测试代码在这里:https ://github.com/sanyuwen/IMP/blob/master/ImpTest.hs
当我使用 GHC 导入 DSemImp 模块时,我遇到了很多错误。
DSemImp.hs:52:32: error:
Not in scope: type constructor or class ‘Identifier’
|
52 | data FormalParameter = Constfp Identifier | ^^^^^^^^^^
It said data FormalParameter = Constfp Identifier is not legal.
without this how can I define formal parameter ??