1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[Help!] Haskell

Discussão em 'Programação' iniciada por Neo4, 23 de Outubro de 2006. (Respostas: 32; Visualizações: 2240)

  1. Neo4

    Neo4 Banido

    Boas Pessoal eu sou novato nestas bandas da programaçao e estou aqui com um problema em haskell que é o seguint:

    type Aluno = (Int, String, Float)
    type Curso = [Aluno]

    alunos :: Curso
    alunos = [ (1234, "Jose Azevedo", 13.2), (2345, "Carlos Lopes", 9.7), (3456, "Rosa Mota", 17.9) ]


    preciso agora de criar uma funçao que me de o nr d alunos reprovados e o nr d alunos aprovados eu tentei isto:

    aAprovados :: [Aluno] -> [Int]
    aAprovados [] = []
    aAprovados ((x,y,z):zs) = if z >= 9.5
    then 1
    else z:(aAprovados zs)

    mas nao resultou e tambem so calculava o nr d alunos aprovados e a funçao tem k calcular os 2:S

    thnks e abraços ][
     
    Última edição: 23 de Outubro de 2006
  2. mpLopes

    mpLopes Power Member

    func l = ( nr, ((length l) - nr))
    where nr = length ([ z | (x,y,z) <- l, z > 9.5 ])
     
  3. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    para o caso de ainda não teres dado listas por compreensão...

    Código:
    ap_rep [] = (0,0)
    ap_rep ((_,_,n):t) = let (ap,rep) = ap_rep t
                         in if n>=9.5 then (ap+1,rep)
                                      else (ap,rep+1)
    já agora, as tags 'code' existem para serem utilizadas...
     
  4. mpLopes

    mpLopes Power Member

    para serem usadas por quem as quer usar.
    o homem não queria um texto com tags code, queria uma função que lhe resolve-se o problema.
    foi claramente isso que eu fiz.
     
  5. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    será que não se percebe melhor o código quando elas são usadas?
    e se calhar a tua função não lhe resolve o problema pois falta um (ou mais) espaços antes do 'where' (que provavelmente até os colocaste mas como não usaste as tags foram eliminados).
     
  6. Neo4

    Neo4 Banido

    txii isso ja é areia a mais para o meu camiao :S

    podes explicar essa funçao sff?

    1 amg meu cnsgui a definir 1 funçao para os aprovados, dp para os reprovados e juntou tudo numa outra funcao...
    thnks
     
  7. nunoalex

    nunoalex Power Member

    aAprovados :: [Aluno] -> Int
    aAprovados [] = 0
    aAprovados ((x,y,z):zs) = if z >= 9.5 then 1+aAprovados (zs)
    else aAprovados zs



    nAprovados :: [Aluno] -> Int
    nAprovados [] = 0
    nAprovados ((x,y,z):zs) = if z <= 9.5 then 1+nAprovados (zs)
    else nAprovados zs

    numero :: [Aluno] -> [Int]
    numero [] = [0,0]
    numero l = [ aAprovados l, nAprovados l]

    isto e uma formula simples de fazer, calculas os aprovados e os nao aprovados e depois juntas numa funcao.... espero ter ajudado
     
  8. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    Código:
    ap_rep [] = (0,0)   -- se a lista está vazia não há aprovados nem reprovados
    ap_rep ((_,_,n):t) = let (ap,rep) = ap_rep t
    -- se não está vazia calculamos o resultado para a cauda da lista e
    --    colocamos o resultado no par (ap,rep)
                         in if n>=9.5 then (ap+1,rep)
                                      else (ap,rep+1)
    -- agora verificamos se a nota do aluno que está no topo da lista é ou não maior do que 9.5
    -- se sim somamos 1 ao número de alunos aprovados que existem na cauda da lista
    -- caso contrário somamos 1 ao número de alunos reprovados
    

    mas a solução mais fácil de perceber é mesmo a do nunoalex (pois evita o uso do 'let...in')
     
  9. Neo4

    Neo4 Banido

    thnks :)

    eu normalmente defino 1º para o 1º elemento da lista e só depois para a cauda, ainda tenho que continuar a treinar haskell pa ver s cmço a encurtar as esquaçoes :s

    obrigado a todos ][
     
  10. AwakE

    AwakE Banido

    O Haskell é tudo menos legivel...bolas...que raio de linguagem...
     
  11. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    isso depende da forma como cada um programa.
    a última versão em que está tudo separado acho que é bem legível (é claro que para quem está habituado a linguagens tipo C, não tem nada a ver).
     
  12. AwakE

    AwakE Banido

    Parte do meu trabalho é programar, e muitas vezes trabalho em programas feitos por outras pessoas. Basicamente enquando que vocês tentam encurtar as formas, para mim quanto mais explicito estiver melhor :D.

    A legibilidade num contexto empresarial é tremendamente importante, por vezes tão importante como a eficiencia do código.
     
  13. Fork

    Fork What is folding?

    Alguem me pode ajudar a defenir uma instancia da Class Read?

    Nao sei os metodos que existem nesta classe.
     
  14. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    que tipo é que queres definir como instância da classe Read? tu não usaste nenhum data type.


    definir as funções dessa classe é um pouco complicado... a forma mais fácil de resolver o problema é usar o 'deriving'.
     
  15. Fork

    Fork What is folding?

    Código:
    data Exp o  = Const Int | Var String | Op o [ Exp o ] 
         deriving Read
    
    data Ops    = Add | Mul | Sim  
         deriving Read
    
    Apenas preciso de exemplos de como defeni-la, estes são dois dos DataTypes que estou a usar

    Tenho mesmo de a fazer a mao para ter nota no trabalho
     
  16. jck

    jck Power Member

    Fork também estou a fazer esse trabalho :P
    Não arranjas ai um link fixe sobre transformadores de monads?
     
  17. Rui_Carlos

    Rui_Carlos 1st Folding then Sex



    Código:
    data Ops = Add | Mul | Sim deriving Show
    
    instance Read Ops where
      readsPrec _ r = [(str2ops x,t) | (x,t) <- lex r]
        where str2ops "Add" = Add
              str2ops "Mul" = Mul
              str2ops "Sim" = Sim
    
    data Exp o  = Const Int | Var String | Op o [ Exp o ] deriving Show
    
    instance (Read o) => Read (Exp o) where
      readsPrec _ r=[(Const x,t)|("Const",r')<-lex r,(x,t)<-reads r']
                  ++[(Var x,t)|("Var",r')<-lex r,(x,t)<-lex r']
                  ++[(Op o x,t)
                     |("Op",r1)<-lex r
                     ,(o,r2)<-reads r1
                     ,(x,t)<-readList r2]
    nunca tinha feito isto antes, como tal tive que procurar infomações na net sobre o assunto. deixo aqui alguns links que podem ser úteis:
    http://lml.ls.fi.upm.es/~jjmoreno/prog_dec/haskell_EN_read_show.pdf
    http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Read
    http://www.zvon.org/other/haskell/Outputprelude/Read_c.html
    http://www.mathematik.uni-marburg.de/~priebe/docs/mirror/tutorial/stdclasses.html
     
  18. vctp

    vctp Power Member


    Também estou um bocado atrapalhado com o trabalho e precisava de umas dicas:P

    Alguém me pode dizes como definiu (por exemplo) o func Add na instancia Opt Ops e como fez o push x:005:

    thanks!!
     
  19. Fork

    Fork What is folding?

    Ando a rever o código todo, refiz agora o func Add para

    func Add (x:y:t) = (x+y:t)

    amanha volto com o push
     
  20. vctp

    vctp Power Member

    Ja consegui fazer o func desta forma

    func Add = \[x,y] -> x + y

    visto que a aridade é 2...

    O push é que ainda nada
     

Partilhar esta Página