Jump to content
bogdanvaduva

Haskell program to return an int for a symbol or a value

Recommended Posts

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

Link to comment
Share on other sites

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"

  • Upvote 7
Link to comment
Share on other sites

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 by Silviu
  • Upvote 1
Link to comment
Share on other sites

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++. 

Link to comment
Share on other sites

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 :D Tin sa va multumesc pentru sprijin, tuturor, au fost de foarte mare ajutor in ceea ce priveste intelegerea logica a acestui limbaj.

Link to comment
Share on other sites

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 :D

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...