Ir para conteúdo


- - - - -

funcao que recebe uma lista de listas e uma string e que devolva True or False


  • Por favor inicie sessão para responder
22 respostas a este tópico

#1 AJBM

AJBM

    CRLF

  • Membro
  • PipPipPipPipPip
  • 702 mensagens

Publicado 14 de Fevereiro de 2012 - 21:11

Boas eu tenho que fazer uma funcao que recebe uma lista de listas e uma string e que devolva True or False se a string estiver na lista devolve True senao devolve False. Ja tentei fazer pela recursividade e usar a funcao any mas nao consigo

#2 lesiano16

lesiano16

    Boolean User

  • Membro
  • PipPipPip
  • 122 mensagens

Publicado 14 de Fevereiro de 2012 - 22:11

Posta o código que já fizeste. Sabes utiliza a função de ordem superior filter ?

#3 Polmax

Polmax

    Boolean User

  • Membro
  • PipPipPip
  • 174 mensagens

Publicado 14 de Fevereiro de 2012 - 22:23

Ver Mensagemlesiano16, em 14 de Fevereiro de 2012 - 22:11, disse:

Posta o código que já fizeste. Sabes utiliza a função de ordem superior filter ?
Usa o filter como disse lesiano16 , o filter devolve uma lista dos elementos que satisfazem uma condição por exemplo (=="aaa")
Ou também podes simplesmente percorrer a lista com recursividade
Numa lista de strings (x:xs) ->x é uma string
e no teu caso x seria uma lista de strings .
Fazendo uma função auxiliar deste tipo
Código (Haskell):
aux::[string]->Bool
depois aplicas aux na função principal a x e recursivamente a xs

#4 AJBM

AJBM

    CRLF

  • Membro
  • PipPipPipPipPip
  • 702 mensagens

Publicado 15 de Fevereiro de 2012 - 11:53

Boas!
Código (Haskell):
fn a []= False
fn a (x:xs)= any(==a) x
Eu ja fiz isto. Mas o meu grande problema,eu ja tentei so mesmo com lista so que da erro.
Se eu fizer assim Código (Haskell):
any (=='o') "ww"
nao da erro devolve False se eu fizer isto Código :
any (=='oo') "ww"
da erro Código (Haskell):
<interactive>:1:10:
    lexical error in string/character literal at character 'o'


#5 Polmax

Polmax

    Boolean User

  • Membro
  • PipPipPip
  • 174 mensagens

Publicado 15 de Fevereiro de 2012 - 12:39

' ' isto é pra identificar um char
" " isto é pra identificar uma lista de char , ou seja uma string

#6 AJBM

AJBM

    CRLF

  • Membro
  • PipPipPipPipPip
  • 702 mensagens

Publicado 15 de Fevereiro de 2012 - 13:50

Mas se eu fizer com aspas tambem me da erro Código (Haskell):
any(=="ww") "ww"

<interactive>:1:13:
    Couldn't match expected type `[Char]' with actual type `Char'
   Expected type: [[Char]]
     Actual type: [Char]
   In the second argument of `any', namely `"ww"'
   In the expression: any (== "ww") "ww"

e o filter tambem nao funciona
Código (Haskell):
filter(=="ww") "ww"

<interactive>:1:16:
    Couldn't match expected type `[Char]' with actual type `Char'
   Expected type: [[Char]]
     Actual type: [Char]
   In the second argument of `filter', namely `"ww"'
   In the expression: filter (== "ww") "ww"


#7 Polmax

Polmax

    Boolean User

  • Membro
  • PipPipPip
  • 174 mensagens

Publicado 15 de Fevereiro de 2012 - 14:19

Normal , o any pega num predicado no teu caso (=="ww") e vai a uma lista
se o teu predicado é ser igual a "ww" que já é uma string então ele tem que buscar a uma lista de strings
ou seja [[Char]]

O que tinhas que ter era any (==String) [String] ou seja any (=="ww") [String1,String2,etc]

#8 AJBM

AJBM

    CRLF

  • Membro
  • PipPipPipPipPip
  • 702 mensagens

Publicado 15 de Fevereiro de 2012 - 15:27

Tipo mas o any nao funciona so para lista any(==1) [1,2,3,4  ]? o que ele vai fazer aqui é  pecorrer  uma lista de listas any(=="ww") ["www","qqq"]?

#9 Baderous

Baderous

    Unsigned User

  • Moderador
  • PipPipPipPipPipPip
  • 2667 mensagens

Publicado 15 de Fevereiro de 2012 - 15:41

Para quê complicar? Usa recursividade juntamente com a função elem e tens o caso resolvido.

#10 Polmax

Polmax

    Boolean User

  • Membro
  • PipPipPip
  • 174 mensagens

Publicado 15 de Fevereiro de 2012 - 15:53

any::(a->Bool)->[a]->Bool
se tens (=='w')  o teu a é um char logo,([a]->Bool) vais ter que buscar numa lista de char
se tens um (=="ww") o teu a é uma string logo vais ter que buscar a uma [String]
ele funciona para um a e uma lista de [a] na importa se o a é um inteiro uma string um char desde que de depois a tua lista seja uma lista do tipo [a]

#11 AJBM

AJBM

    CRLF

  • Membro
  • PipPipPipPipPip
  • 702 mensagens

Publicado 15 de Fevereiro de 2012 - 15:55

ja percebi obrigado :)

#12 Polmax

Polmax

    Boolean User

  • Membro
  • PipPipPip
  • 174 mensagens

Publicado 15 de Fevereiro de 2012 - 16:09

Código (Haskell):
--Exemplos


func ::Int->[Int]->Bool
func _ []=False
func n l=any (==n) l

--com uma [[Int]]
func1 ::Int->[[Int]]->Bool
func1 _ []=False
func1 n (x:xs)=any (==n) x||func1 n xs

--sem uso de funções prédefinidas

func2 ::Int->[Int]->Bool
func2 _ []=False
func2 n (x:xs)|n==x=True
              |otherwise=func2 n xs

--sem uso de funções prédefinidas e com uma [[Int]]


func3 ::Int->[[Int]]->Bool
func3 _ []=False
func3 n (x:xs)=func2 n x||func3 n xs

--com elem


func4 ::Int->[Int]->Bool
func4 _ []=False
func4 n l=elem n l


Fiz vários exemplos com estas funções que foram mencionadas e sem nenhuma delas

#13 veaoum

veaoum

    Boolean User

  • Membro
  • PipPipPip
  • 191 mensagens

Publicado 15 de Fevereiro de 2012 - 17:33

Boas uma coisa muito estúpida da minha parte, mas já não me recordo muito bem de haskel mas ele era considerado muito poderoso na forma como era feito a recursividade não é possivel fazer essa função da seguinte forma:
Código (Haskell):
func a [] = false
func a a:xs= true
func a x:xs = func a xs
 

ela não fará logo a comparação da string ([char]) dando logo true se encontrar?

#14 Polmax

Polmax

    Boolean User

  • Membro
  • PipPipPip
  • 174 mensagens

Publicado 15 de Fevereiro de 2012 - 18:15

Não sei ao que te estas a referir mas o que fizeste esta incorrecto
Código (Haskell):
func a [] = false
func a a:xs= true
func a x:xs = func a xs
func a (a:xs) simplesmente da erro porque tas a passar o mesmo nome a duas coisas diferentes.
e func a (x:xs) = func a xs a única coisa que faz é repetir a função pra todos os elementos sem nenhuma comparação feita

#15 veaoum

veaoum

    Boolean User

  • Membro
  • PipPipPip
  • 191 mensagens

Publicado 17 de Fevereiro de 2012 - 04:15

Ok erro meu.... Estou muito destreinado em haskel.... Pensei que ela fazia logo a comparação pois as coisas não são propriamente diferentes (são do mesmo tipo) e então isto funciona ou é demasiado à C:
Código (Haskell):
func a [] = false
func a x:xs= if a==x then true else func a xs

Já funciona, não?

#16 Polmax

Polmax

    Boolean User

  • Membro
  • PipPipPip
  • 174 mensagens

Publicado 17 de Fevereiro de 2012 - 11:27

Sim, só que normalmente em vez do if o pessoal usa guardas (acho que se chama assim XD)
Código (Haskell):
func a []=False
func (x:xs) |a==x=True
                 |otherwise=func a xs


#17 lesiano16

lesiano16

    Boolean User

  • Membro
  • PipPipPip
  • 122 mensagens

Publicado 17 de Fevereiro de 2012 - 15:32

Podes sempre utilizar o filter para ficar mais robusto:
Código (Haskell):
func a l = (filter (a==) l) != []


#18 Polmax

Polmax

    Boolean User

  • Membro
  • PipPipPip
  • 174 mensagens

Publicado 17 de Fevereiro de 2012 - 18:24

Não querias dizer ?  Código (Haskell):
func a l = (filter (a==) l) /= []


#19 lesiano16

lesiano16

    Boolean User

  • Membro
  • PipPipPip
  • 122 mensagens

Publicado 17 de Fevereiro de 2012 - 18:28

Ya, confundi com c.

#20 veaoum

veaoum

    Boolean User

  • Membro
  • PipPipPip
  • 191 mensagens

Publicado 20 de Fevereiro de 2012 - 06:10

Mas teoricamente não fica mais lento?! Isto falando com listas muito grandes.....