Stoyan Peev stoyan.peev at gmail.com
Fri Jun 24 21:57:38 CEST 2011

```Hello all,

I am experiencing some issues to do my course task in university.

I have to write a calculator- function in Haskell. The function
argument is a list of strings and also form such list, as each string
of the argument made definite action:
- If the string has the form of an arithmetic _expression_ - calculate
this _expression_. The string result becomes part of the list-result.
If the _expression_ contains a variable which is not assigned value,
the result is displayed "undefined".
- If the string has the form- Name = value calculated from the last
_expression_ is assigned to the variable with the corresponding name
in the list, and in the result list is formed a string with type
- If there is not a calculated _expression_ to be assigned to form a
string "no value".
- If the string is non-blank, but there is a species different from
the above two case, form the string "error".
- If the string is empty, incl. when it contains only spaces, in the
result there is not form a string.

Expressions consist of integers without sign variables, operations +
(Addition), - (subtraction), * (multiplication) and / (divide) and
parentheses. Where no brackets, the operations are performed from left
to right, but * and / precede the + and -. Implementation of any
operation gives integer; in the division rejected the fractional part,
if any.
Variables have names of one letter - from the Latin small letter. In
the beginning, end or between the elements of each row can have spaces
- they are irrelevant to its correctness.
Example: the list-argument
["3 +7 / 2" "2 + x", "= s", "2 * s +4", "", "2 + +4 / 5]
function should provide a result-list
["6", "undefined", "s = 6", "16", "error"].

I say another person have the same task, but he didn't do anything. I
started doing this task myself but i get stuck in the middle. Then i
started searching for something that could help me and find out you :)

The code i have written so far uses the library file "Parsing.lhs"
but what i have written is taking those actions that i already
described, only for a string. I cannot modify it to work for list of
string, and complete the whole task.

I'll be glad to finish the task myself, but i am going to need some help.

Here is the code i have already written:

import Parsing

expr                          :: Parser Int
expr                          =  do t <- term
do symbol "+"
e <- expr
return (t+e)
+++ do symbol "-"
e <- expr
return (t-e)
+++ return t
term                          :: Parser Int
term                          =  do f <- factor
do symbol "*"
t <- term
return (f * t)
+++ do symbol "/"
t <- term
return (f-t)
+++ return f
factor                        :: Parser Int
factor                        =  do symbol "("
e <- expr
symbol ")"
return e
+++ natural
eval                          :: String -> Int
eval xs                       =  case (parse expr xs) of
[(n,[])]  -> n
[(_,out)] -> error ("undefined")
[]        -> error "error"