bogdanvaduva Posted April 23, 2016 Report Share Posted April 23, 2016 Salut, Sunt oarecum nou in ceea ce priveste Haskell si am o problema legata de un mic program care ar trebui sa imi returneze un intreg atunci cand primeste un tip de date "Value" sau "Symbol" Am urmatorul tip de date abstract: data Expr = Symbol String | Value Int deriving (Show, Read) Si ar trebui sa definesc cate o functie pentru cele 2 cazuri, care sa imi returneze int-ul din expresie. Ma gandesc ca ar trebui sa fie ceva de genul asta: returnInt :: Expr -> Int returnInt Value x = x | Symbol x = x Dar nu sunt convins ca e chiar ok. Ma poate ajuta cineva? Multumesc Quote Link to comment Share on other sites More sharing options...
Ana-Cristina Posted April 23, 2016 Report Share Posted April 23, 2016 Buna. Ceva de genul asta: returnInt :: Expr -> Int returnInt (Value x) = x returnInt (Symbol x) = length x Unde inlocuiesti length x cu ceva care sa intoarca un intreg dintr-un string in functie de ce ai nevoie. Daca vrei sa iti intoarca eroare pentru cazul cu string: returnInt (Symbol x) = error "Eroareeee" 7 Quote Link to comment Share on other sites More sharing options...
Silviu Posted April 23, 2016 Report Share Posted April 23, 2016 (edited) Acel moment când 2 newbie cu un post postează lucruri mai interesante decât alții cu sute de postări.PS: @Ana-Cristina e profă la FMI (Haskell, Programare Declarativă, Programare Logică și altele) și eu i-am arătat topicul. Așa că veniți la FMI la facultate, că s-au mai schimbat puțin mentalitățile. Edited April 23, 2016 by Silviu 1 Quote Link to comment Share on other sites More sharing options...
bogdanvaduva Posted April 23, 2016 Author Report Share Posted April 23, 2016 Multumesc foarte mult pentru raspuns @Ana-Cristina! Si imi cer scuze, sunt nou si sunt convins ca nu toate intrebarile mele sunt tocmai pertinente. Dar vreau sa inteleg cat mai bine limbajul si felul cum ar trebui sa functioneze un limbaj de programare non-imperativ. Pana acum am luat legatura doar cu limbajele imperative cum ar fi java sau c++. Quote Link to comment Share on other sites More sharing options...
Ana-Cristina Posted April 23, 2016 Report Share Posted April 23, 2016 Cu placere. Un bun inceput ar fi aici: http://learnyouahaskell.com/chapters 1 Quote Link to comment Share on other sites More sharing options...
bogdanvaduva Posted April 23, 2016 Author Report Share Posted April 23, 2016 Am citit pana la capitolul 7, dar nu am apucat sa exersez foarte mult si se apropie deadline-ul la assignment. Acum am inceput sa pun in practica ce am invatat si incerc sa inteleg pas cu pas, sa fiu sigur ca stiu ce fac. Quote Link to comment Share on other sites More sharing options...
Wolfgang Posted April 24, 2016 Report Share Posted April 24, 2016 Recomand: Real World Haskell (download) The Haskell Road to Logic, Math and Programming (download) Beginning Haskell: A project-based approach (download) 1 Quote Link to comment Share on other sites More sharing options...
Ana-Cristina Posted April 24, 2016 Report Share Posted April 24, 2016 Sau http://www.inf.ed.ac.uk/teaching/courses/inf1/fp/ Aici gasesti si teorie si exercitii si solutii pentru exercitii. E un curs fain. 1 Quote Link to comment Share on other sites More sharing options...
bogdanvaduva Posted April 24, 2016 Author Report Share Posted April 24, 2016 Mai am o intrebare, daca se poate, desigur. Am reusit sa imi defineesc o functie care imi intoarce urmatoarele: data Expr = Add Expr Expr | Sub Expr Expr | Mult Expr Expr | Equal Expr Expr | Smaller Expr Expr | Symbol String | Value Int deriving (Show, Read) returnExpresie :: Expr -> Int returnExpresie (Value x) = x returnExpresie (Add ex1 ex2) = (returnExpresie ex1 ) + (returnExpresie ex2 ) returnExpresie (Sub ex1 ex2) = (returnExpresie ex1) - (returnExpresie ex2) returnExpresie (Mult ex1 ex2) = (returnExpresie ex1) * (returnExpresie ex2) returnExpresie (Equal ex1 ex2) = if (returnExpresie ex1 ) == (returnExpresie ex2) then 1 else 0 returnExpresie (Smaller ex1 ex2) = if (returnExpresie ex1 ) < (returnExpresie ex2) then 1 else 0 returnExpresie (Symbol s) = undefined Asa cum probabil ati inteles, functia mea evalueaza o expresie in functie de parametrul primit. Exemplele sunt urmatoarele (Add (Value 1) (Value 2)) = va intoarce desigur valoarea 3 Dilema mea este ca atunci cand voi avea (Symbol "x") ar trebui sa transform acel string "x" intr-o variabila x de tipul int. Ma gandesc ca s-ar face cu functia predefinita read insa nu am o idee clara despre cum as putea sa faca cest lucru. O alta problema ar mai fi ca ar trebui sa salvez aceasta variabila astfel in cat sa fie accesibila programului, pentru a ii putea assigna valori mai tarziu. M-am blocat aici Tin sa va multumesc pentru sprijin, tuturor, au fost de foarte mare ajutor in ceea ce priveste intelegerea logica a acestui limbaj. Quote Link to comment Share on other sites More sharing options...
Ana-Cristina Posted April 24, 2016 Report Share Posted April 24, 2016 Daca returnExpresie evalueaza expresia respectiva ar trebui sa mai ai un parametru cu valoarea cu care se inlocuieste variabila X. Ceva de genul: returnExpresie (Symbol x) y = y. Deci in toate ecuatiile iei dupa tine parametrul y care de tip int. 1 Quote Link to comment Share on other sites More sharing options...
bogdanvaduva Posted April 24, 2016 Author Report Share Posted April 24, 2016 Mm, de acord, dar ca sa fiu sigur ca retin o valoare pentru fiecare variabila, nu mi-ar trebui cumva o lista de tupluri? Gen functia mea sa devina returnExpresie :: Expr ->[(String, Int)] -> Int Acum, ideea e ca nu stiu cum sa fac sa ma joc cu tipul asta de functie astfel incat sa retin valori pentru variabile. Ar trebui sa retin valori pentru acele variabile cu patternul returnExpresie (Symbol x) intr-o lista, si acea lista sa o dau ca parametru la fiecare expresie. Dar nu stiu cum as putea face asta Quote Link to comment Share on other sites More sharing options...
Ana-Cristina Posted April 24, 2016 Report Share Posted April 24, 2016 Ok. Poti sa dai o lista de variabila - expresie si sa faci o functie getValue(lista, variabila) care iti cauta in lista var X si iti intoarce valoarea. 3 Quote Link to comment Share on other sites More sharing options...