Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 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

Mensagens Recomendadas

AJBM

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Polmax

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

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'

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

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"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Polmax

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]

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Polmax

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]

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Polmax

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
veaoum

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Polmax

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
veaoum

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Polmax

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
lesiano16

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.