Yeah, that really helped me :))

Finally i got the results i wanted :

Main> p ["2*34/3","2+3","2*(6/2)"]
[22,5,6]


There is only one more question i have about this.  I have already
written 2 error captures, but they don't really apply to the task i
have. Here are my error captures:

                                    [(_,out)] -> error ("неопределено")
                                    []        -> 0

and here is the result

Parsing> p ["2*34/3","2+3","2*(6 / 2)",""]
[22,5,6,0]

It's ok for me, but i have to make it, not showing anything if there are blanks.
I suggest i had to make some checking in the caller function before
calling the "eval" funcition.
Also somehow i have to check the syntax of the string and if it is
like "=x", the result should be "x= previous string"

Probably i have to user "where" for the caller function or some if cases :?




2011/6/27 Daniel Patterson <lists.hask...@dbp.mm.st>:
> so think about the high level design for a second, and let that guide the 
> types. then the types should guide the code.
>
> p, which I assume is the top level evaluation, is supposed to take a list of 
> strings, and produce a list of integers (the result of evaluating the 
> expression), right? So it should have type p :: [String] -> [Int].
>
> Now the base case is obvious - if you are given an empty list of strings, 
> then you should give back an empty list of results.
>
> The recursive case is a little more complicated - the idea with simple 
> recursion is that the recursive case should eventually land you at the base 
> case, which will stop the recursion. With lists, this usually means that each 
> application of the recursive case should call itself on the rest of the list, 
> and somehow process the first element of the list (it doesnt have to be this 
> way, but often is).
>
> So in your case, the recursive case should be: evaluate the first element of 
> the list, and then call the whole function on the rest of the list. You can 
> check this mentally by using a couple examples. In the case of a one element 
> list, this means that it will evaluate the first (and only) element of the 
> list, and then call itself on the rest of the list, which is an empty list, 
> which is the bottom case and therefore ends the recursion. On a two element 
> list, this can be checked as well.
>
> Now the types should be your best friend. You know that you want:
>
> p :: [String] -> [Int]
>
> That is from the problem statement.
>
> So you write the base case first:
>
> p [] = []
>
> Now for the recursive case, you know you want to eval the first element, and 
> then call the function on the rest of the list. But since you need to return 
> a list eventually, then you need to return a list in this function. You know 
> that calling the function recursively will result in a list (the type 
> guarantees that), so if you've evaluated the first element of a list, 
> resulting in an Int, and you have a list of Int's that is the rest of the 
> list, how do you combine those? Well, put the element at the beginning of the 
> list!
>
> p (x:xs) = (eval p) : (p xs)
>
>
> Now this is a really really common pattern - do the same thing to every 
> element of a list. The first thing in haskell to do if you think that what 
> you are doing might already exist in some generalized form is to try to 
> describe what the function is that you want. So in our case, you want a 
> function that takes another function and applies it to every element in the 
> list. This function would have type:
>
> (a -> b) -> [a] -> [b]
>
> In your case the (a -> b) is String -> Int (the function eval), the [a] is 
> [String], [b] is [Int]. Now if you take this and search on Hoogle (a haskell 
> search engine: 
> http://haskell.org/hoogle/?hoogle=%28a+-%3E+b%29+-%3E+%5Ba%5D+-%3E+%5Bb%5D ), 
> the first result is a function called map, which does exactly what you want. 
> So you can actually write your whole p function as:
>
> p :: [String] -> [Int]
> p xs = map eval xs
>
> Or, if you are okay with partial application, this is equivalent to:
> p :: [String] -> [Int]
> p = map eval
>
> On Jun 25, 2011, at 3:56 PM, Jack Henahan wrote:
>
>> The error in ghci is
>>
>> Couldn't match expected type `Int' with actual type `[a0]'
>>    In the expression: []
>>    In an equation for `p': p [] = []
>>
>> You've defined p as [String] -> Int, but then your base case is p [] = []. 
>> [] is not an Int. I changed it to 0 and it'll compile, at least, but I'm not 
>> sure if that's the effect you're after.
>>
>> http://hpaste.org/48324
>> Edited code (really just indentation changes and the change from p [] = [] 
>> to p [] = 0)
>>
>> On Jun 25, 2011, at 3:19 PM, Stoyan Peev wrote:
>>
>>> First I am using WinHugs.
>>>
>>> that's the code i made so far but it's still not working:
>>>
>>> http://hpaste.org/48318
>>>
>>>
>>> Error:
>>> ERROR file:.\kursovazadacha.hs:36 - Type error in explicitly typed binding
>>> *** Term           : p
>>> *** Type           : [String] -> [a]
>>> *** Does not match : [String] -> Int
>>>
>>>
>>> I'm still breaking down somewhere ...
>>>
>>>
>>>
>>> 2011/6/25 Daniel Patterson <lists.hask...@dbp.mm.st>:
>>>> what haskell compiler are you using? And what does the "include" line do?
>>>>
>>>> That does not look like a GHC error message (the only compiler I'm 
>>>> familiar with), but it seems like it is saying that you should not have 
>>>> the extra newlines between the function type signature and declaration. - 
>>>> that's only my guess, based on the assumption that the whitespace is being 
>>>> converted to a syntax with explicit semilcolon line terminations.
>>>>
>>>> now, looking at the actual code, the type of the parse function is [a] -> 
>>>> [a]. This means that you can parse a list of anything into a list of 
>>>> anything, which doesnt make much sense. This should probably be [String] 
>>>> -> [String]  (you are parsing a list of strings to a list of strings, 
>>>> yes?). Now the base case of parse (the first case) makes sense, but look 
>>>> at the second case. parse is being given a list of elements (which you 
>>>> have used pattern matching to decompose, but the whole argument, (x:xs), 
>>>> is a list of elements). You are then passing that, unchanged, to eval. 
>>>> This means that eval must take the same type. Does it? how would you apply 
>>>> eval to each element in that list, instead of just applying it to the 
>>>> whole list?
>>>>
>>>> On Jun 24, 2011, at 4:31 PM, Stoyan Peev wrote:
>>>>
>>>>> I found the library myself, and i already put the code in that site:
>>>>>
>>>>> http://hpaste.org/48277
>>>>>
>>>>>
>>>>>
>>>>> That's what i have tried to do for making the task by calling the one
>>>>> string function by another one:
>>>>>
>>>>> include kursovazadacha
>>>>>
>>>>> parse :: [a] -> [a]
>>>>>
>>>>> parse [] = []
>>>>>
>>>>> parse (x:xs) = eval (x:xs)
>>>>>
>>>>>
>>>>> The error from the compiler:
>>>>>
>>>>> ERROR file:.\list.hs:3 - Syntax error in declaration (unexpected `;',
>>>>> possibly due to bad layout)
>>>>>
>>>>>
>>>>> On Fri, Jun 24, 2011 at 11:20 PM, Daniel Patterson
>>>>> <lists.hask...@dbp.mm.st> wrote:
>>>>>> What have you tried to do in order to make it work for the list, and 
>>>>>> what error results? What is confusing about the error message? More 
>>>>>> generally, how could you transform an operation on a single string into 
>>>>>> one that does the same thing to a list of strings? You've probably 
>>>>>> talked about higher order functions in your class - would any of the 
>>>>>> common ones (filter, map, foldr) be helpful here? Would any encapsulate 
>>>>>> what you are trying to do?
>>>>>>
>>>>>> If you include these kinds of things, I think you'll find this community 
>>>>>> to be very helpful; without that (showing what your thought process is, 
>>>>>> why it isn't working, what seems confusing about what the haskell 
>>>>>> compiler is telling you, etc), you are not going to get help here. 
>>>>>> People here are very friendly and willing to help people learn; this is 
>>>>>> not a place to come to get an assignment finished :)
>>>>>>
>>>>>> Also, could you put the library you are using (I'm assuming that this is 
>>>>>> provided by your university) and the code on somewhere like hpaste.org, 
>>>>>> so that the formatting is not messed up by email, and it is syntax 
>>>>>> highlighted?
>>>>>>
>>>>>> On Jun 24, 2011, at 3:57 PM, Stoyan Peev wrote:
>>>>>>
>>>>>>> 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"
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Thanks all in advance :)
>>>>>>>
>>>>>>> --
>>>>>>> Best Wishes
>>>>>>> Stoyan Peev
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Haskell-Cafe mailing list
>>>>>>> Haskell-Cafe@haskell.org
>>>>>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Поздрави,
>>>>> Стоян Пеев
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Поздрави,
>>> Стоян Пеев
>>>
>>> _______________________________________________
>>> Haskell-Cafe mailing list
>>> Haskell-Cafe@haskell.org
>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>> <398E692F.asc>
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe@haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>



-- 
Поздрави,
Стоян Пеев

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to