Contains element

1 10 2007

Um problema que tive enquanto fazia o Catalogador de discos (CD) foi na inexistência de uma função que verificasse se todos os elementos de um determinado conjunto faziam parte de um outro conjunto, interessando a ordem.

Exemplificando:

Imaginando que existe uma função f temos,

f [1,9,8,5] [3,4,5,1,3,4,7,8,94,3,1,9,8,5,2,2,2,15,24] terá que originar o resultado

True

.

Encontrei esta solução, se tiverem uma ideia melhor estou receptivo.

{-# OPTIONS -fglasgow-exts #-}
module Main where
import List
contain :: (Eq [a] , Eq a) => [a] -> [a] -> Bool
contain s1 s2 | null s1 || null s2 = False
contain s1@(h:_) s2 =
        let len   = length s1
            elems = elemIndices h s2
        in  (or . map (==s1)) [take len $ drop n s2 | n <- elems ]

código aqui


Actions

Information

2 responses

10 11 2007
Hélder Pereira

Não podes por ‘Eq [a]’, nas assinaturas das funções junto das classes, só se pode por variáveis de tipo (e não tipos compostos).

Já agora a função que fizeste é a isInfixOf😛

10 11 2007
ulisses

“map (==s1)”, sendo “s1” o pedaço que queremos testar (lista)…
Estou a usufruir da instancia de Eq para listas.

Mas de qualquer das formas, faz sentido que assim não aconteça pois significa que já estamos a definir coisas a mais na nossa função, a dar uma paço maior que a perna.

Devo dizer que desconhecia por completo a existência da isInfixOf… E eu que pensava que conhecia a API… :S
Mas também ainda não ando em MFES, por isso tenho desculpa😛

Não evitei em ir ver a definição da função:

isInfixOf :: (Eq a) => [a] -> [a] -> Bool
isInfixOf needle haystack = any (isPrefixOf needle) (tails haystack)

muito elegante e simples…

Mas de qualquer das formas continuo a gostar da minha solução.

Abraço!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s




%d bloggers like this: