Как добавить абстракции функций и процедур к денотационной семантике с использованием haskell?
Я хочу написать программу на Haskell для реализации простого императивного языка, основанного на его денотационной семантике. Я использую GHCi, версия 8.4.2 на Windows. Я столкнулся с некоторой проблемой при реализации абстракции функции и процедуры, описанной ниже.
позвольте мне описать это. Я называю это ИМП. Сначала я определяю абстрактный синтаксис. 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 команды последовательно. Если затем это условная команда, если первое выражение оценивается как истина, то выполните первую команду, в противном случае - вторую команду. Пока это петля. IdentifierC ( ActualParameter): IdentifierC обозначает некоторую функцию в локальной среде. этот ActualParameter является некоторым выражением с некоторым значением. эта команда jus вызывает эту функцию с указанным значением.
в выражении сверху вниз: цифра bool false bool true отрицание выражения получить значение Ident из локальной среды. выражения суммы 2 вычитают 2 выражения произведение 2<объявляют некоторую переменную в выражении IdentifierE (ActualParameter) IdentifierE обозначает некоторую функцию в локальной среде. этот ActualParameter является некоторым выражением с некоторым значением. эта команда jus вызывает эту функцию с указанным значением. наконец получил новое значение в результате этого выражения.
тогда есть семантические домены
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 ??
1 ответ
Вы не определили Identifier
, Хотя вы определили Ident
ты это имел ввиду?