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

Duvida :: Haskell -> Ajuda necessária

Discussão em 'Programação' iniciada por jptugagmr, 2 de Janeiro de 2007. (Respostas: 9; Visualizações: 1080)

  1. jptugagmr

    jptugagmr Power Member

    --função que recebendo uma string mete o primeiro caracter
    --de cada palavra em maiuscula

    import Char

    maiuscula :: String -> String
    maiuscula x =
    do {
    let (y:ys) = words x;
    in if (isUpper(head((y:ys) !! 0)) == False);
    then toUpper(head y);
    else maiuscula (unwords ys));
    }
    maiuscula " " = " "

    Alguém sabe me dizer qual o motivo de isto não dar ??

    agradecia que colocassem em código um solução possível para este problema.

    se possível com " do " pra me habituar.

    Dêem os seu palpites , obrigado pela atenção
    jptugagmr
     
  2. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    Código:
    f x=let s1=words x
            s2=map (\(x:xs)->(toUpper x):xs) s1
        in unwords s2
    esta função só tem um problema: se a string tiver espaços consecutivos e se tiver espaços no início ou no fim.

    já agora, para quê usar o 'do'?
    o 'do' é útil quando temos monads...


    EDIT:
    fica aqui uma versão (monádica) com o 'do'
    Código:
    f::(Monad t)=>String->t String
    f x=do let s1=words x
           let s2=map (\(x:xs)->(toUpper x):xs) s1
           return (unwords s2)
     
    Última edição: 2 de Janeiro de 2007
  3. jptugagmr

    jptugagmr Power Member

    Pra que serve os \ nos map´s ?
     
  4. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    para definir uma função através da notação lambda

    funcao=\(x:xs)->(toUpper x):xs

    é equivalente a

    funcao (x:xs)=(toUpper x):xs


    ao usar o '\' posso colocar directamente a função no map em vez de definir uma função auxiliar.
     
  5. jptugagmr

    jptugagmr Power Member

    o " do " só é utilizado em IO (monádica)?
    e não é do
    { .....;
    }
     
  6. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    que eu saiba, o 'do' só se utiliza com monads (não necessariamente IO).

    se o código estiver identado não é preciso o {...;}.
     
  7. jptugagmr

    jptugagmr Power Member

    já agora, neste codigo :

    import Char
    import IO
    import Random
    import System.IO.Unsafe


    --geraumn = unsafePerformIO (randomRIO(1,50))
    --geraume = unsafePerformIO (randomRIO(1,9))
    --gerauml = [geraumn,geraumn,geraumn,geraumn,geraumn] (geraume,geraume)

    data Aposta = Ap [Int] (Int,Int)


    valida :: Aposta -> Bool
    valida ( Ap l (a,b) ) = ((length l)==5) && (semrep l) &&
    (numvalidos l) && (elem a [1..9]) &&
    (elem b [1..9]) && (a/=b)


    semrep :: Eq a => [a] -> Bool
    semrep (x:xs) | x `elem` xs = False
    | otherwise = semrep xs
    semrep [] = True


    numvalidos (n:ns) | n>=1 && n<=50 = numvalidos ns
    | otherwise = False
    numvalidos [] = True



    funciona tudo.
    é pra ver se é uma aposta do euromilhoes válida.

    mas o que está a comentário não funciona:'(. -> pra gerar uma chave aleatória do euromilhoes

    sabes uma solução pra gerar uma chave aleatória??
     
  8. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    em "gerauml = [geraumn,geraumn,geraumn,geraumn,geraumn] (geraume,geraume)" falta-te um "AP" assim à primeira vista.

    depois não te aconselho a usar o unsafePerformIO. muito provavelmente com essa função vais obter 5 números iguais e 2 estrelas iguais.

    devias usar monads e o 'do'
     
  9. jptugagmr

    jptugagmr Power Member

    tens razão, assim vou ter 5 N e 2 E iguais.

    podias-me sff por o codigo equivalente ao geraumn, mas em monads?
     
  10. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    Código:
    data AP=AP [Int] (Int,Int)
    
    geraAP :: IO AP
    geraAP = do n1 <- randomRIO(1,51)
                n2 <- randomRIO(1,51)
                n3 <- randomRIO(1,51)
                n4 <- randomRIO(1,51)
                n5 <- randomRIO(1,51)
                e1 <- randomRIO(1,9)
                e2 <- randomRIO(1,9)
                return (AP [n1,n2,n3,n4,n5] (e1,e2))
    
    validaAP :: IO Bool
    validaAP = do AP n e <- geraAP
                  let x0 = (length n)==5
                  let x1 = valida1 n
                  let x2 = valida2 e
                  return (x0 && x1 && x2)
    ficaria algo deste género.
     

Partilhar esta Página