• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

AJBM

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

23 posts in this topic

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

aux::[string]->Bool

depois aplicas aux na função principal a x e recursivamente a xs

0

Share this post


Link to post
Share on other sites

Boas!

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

any (=='o') "ww"

nao da erro devolve False se eu fizer isto

any (=='oo') "ww"

da erro

<interactive>:1:10:
    lexical error in string/character literal at character 'o'

0

Share this post


Link to post
Share on other sites

' ' isto é pra identificar um char

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

0

Share this post


Link to post
Share on other sites

Mas se eu fizer com aspas tambem me da erro

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

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"

0

Share this post


Link to post
Share on other sites

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]

0

Share this post


Link to post
Share on other sites

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"]?

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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]

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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:


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?

0

Share this post


Link to post
Share on other sites

Não sei ao que te estas a referir mas o que fizeste esta incorrecto

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

0

Share this post


Link to post
Share on other sites

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:

func a [] = false
func a x:xs= if a==x then true else func a xs

Já funciona, não?

0

Share this post


Link to post
Share on other sites

Sim, só que normalmente em vez do if o pessoal usa guardas (acho que se chama assim XD)

func a []=False
func (x:xs) |a==x=True
                 |otherwise=func a xs

0

Share this post


Link to post
Share on other sites

Podes sempre utilizar o filter para ficar mais robusto:

func a l = (filter (a==) l) != [] 

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

Sim fica. Apesar de ambas percorrerem a lista uma única vez, na primeira ele acaba assim que encontra na segunda não.

Depende mais é da posição do elemento que estás à procura.

0

Share this post


Link to post
Share on other sites

Teoricamente fica mais lento, mas na prática, a diferença não deve ser muita.

Com o lazy evaluation, a filter também deve parar assim que encontrar o elemento (experimentem correr a expressão (filter (==2) [1..]) == [] e vão ver que a função termina, apesar de estar a fazer um filter a uma lista infinita).

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now