Ir para o conteúdo
AJBM

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

Mensagens Recomendadas

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


Link para a mensagem
Partilhar noutros sites
Polmax    0
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


Link para a mensagem
Partilhar noutros sites
AJBM    34
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


Link para a mensagem
Partilhar noutros sites
AJBM    34
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


Link para a mensagem
Partilhar noutros sites
Polmax    0
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


Link para a mensagem
Partilhar noutros sites
AJBM    34
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


Link para a mensagem
Partilhar noutros sites
Polmax    0
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


Link para a mensagem
Partilhar noutros sites
Polmax    0
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


Link para a mensagem
Partilhar noutros sites
veaoum    4
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


Link para a mensagem
Partilhar noutros sites
Polmax    0
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


Link para a mensagem
Partilhar noutros sites
veaoum    4
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


Link para a mensagem
Partilhar noutros sites
Polmax    0
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


Link para a mensagem
Partilhar noutros sites
lesiano16    0
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


Link para a mensagem
Partilhar noutros sites
Rui Carlos    312
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


Link 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