leia Posted October 15, 2013 at 12:19 AM Report #528979 Posted October 15, 2013 at 12:19 AM Boa noite Comecei a muito pouco tempo no haskell e estou a resolver exercícios básicos . Preciso de ajuda porque não consigo finalizar uma resolução.E o que parece algo básico me raptou umas horas sem conseguir 😞 Faz favor me ajudem perceber isso ,ou como fazer, ou que esta de errado Obrigada Quero escrever listas de compreensão que gerem as seguintes listas: ["a0","a1","a2","a3","b0","b1","b2","b3","c0","c1","c2","c3","d0","d1","d2","d3","e0","e1","e2","e3"] ["ab","ac","bb","bc","cb","cc","db","dc","eb","ec"] No segundo caso tudo que soube fazer foi o seguinte: Hugs> [(x,y) | x <- ['a'..'d'], y <- ['b','c']] [('a','b'),('a','c'),('b','b'),('b','c'),('c','b'),('c','c'),('d','b'),('d','c')] Aguardarei uma ajuda. obgd
pwseo Posted October 15, 2013 at 07:54 AM Report #528985 Posted October 15, 2013 at 07:54 AM (edited) leia, Se tiveres em conta que uma String é o mesmo que [Char], então passas a saber que "ab" é o mesmo que ['a','b'], o que é bastante útil. Corrigindo o exemplo que quase conseguiste fazer: Prelude> [ [x,y] | x <- ['a'..'e'], y <- "bc" ] ["ab","ac","bb","bc","cb","cc","db","dc","eb","ec"] Essencialmente, tu estavas a criar pares (x,y) quando devias criar uma lista com eles. Já agora, repara como eu usei ali "bc" em vez de ['b','c'] -- era mais compacto, mas tem o mesmo significado. O raciocínio para o primeiro caso é semelhante. Pista: não tentes usar [0..3] mas sim ['0'..'3'] (ou seja, não utilizes os números directamente mas sim os caracteres que os representam). Meta-dica: rever os tipos de dados básicos de Haskell e como converter números para Char, para String e vice-versa. Edited October 15, 2013 at 07:56 AM by pwseo
fabriceleal Posted October 15, 2013 at 07:58 AM Report #528986 Posted October 15, 2013 at 07:58 AM (edited) Qualquer uma das seguintes maneiras funciona: [[x,y] | x <- ['a'..'d'], y <- ['b','c']] [[x]++[y] | x <- ['a'..'d'], y <- ['b','c']] [x:[y] | x <- ['a'..'d'], y <- ['b','c']] [x:y:[] | x <- ['a'..'d'], y <- ['b','c']] A lógica é que no Haskell uma string é, literalmente, uma lista de characters (ou tem o tipo [Char], por isso para "concatenar" os dois caracteres tens simplesmente que criar uma lista que os contenha como elementos. Edited October 15, 2013 at 07:58 AM by fabriceleal
leia Posted October 15, 2013 at 12:36 PM Author Report #529007 Posted October 15, 2013 at 12:36 PM (edited) Muito obrigada pela ajuda. Percebi o erro que estava a fazer. Ja agora resolvi a primeira tendo em conta as dicas e obtive o resultado pretendido Hugs> [ [x,y] | x <- ['a'..'e'], y <- ['0'..'3'] ] ["a0","a1","a2","a3","b0","b1","b2","b3","c0","c1","c2","c3","d0","d1","d2","d3","e0","e1","e2","e3"] Ja agora tentei fazer diferente e quero uma opinião se esta bem feito ou não usei de maneira correta o concat Hugs> [concat[[x],[y]] | x <- ['a'..'e'], y <- ['0' .. '3'] ["a0","a1","a2","a3","b0","b1","b2","b3","c0","c1","c2","c3","d0","d1","d2","d3","e0","e1","e2","e3"] Hugs> [concat[[x],[y]] | x <- ['a'..'e'], y <- ['b', 'c']] ["ab","ac","bb","bc","cb","cc","db","dc","eb","ec"] Agradeço mais uma vez a vossa ajuda. Leia Edited October 15, 2013 at 12:49 PM by pwseo tags [code].
pwseo Posted October 15, 2013 at 12:49 PM Report #529009 Posted October 15, 2013 at 12:49 PM (edited) Esse concat é completamente desnecessário. Funciona, é verdade, mas por que motivo escreverias “concat [[x],[y]]” cujo resultado é simplesmente “[x,y]”, quando podes escrever directamente “[x,y]”? Essa forma de “escrever diferente” não é muito válida porque simplesmente introduzes uma operação adiconal cuja simplificação é novamente a forma anterior (e complicas o código em termos de legibilidade). Edited October 15, 2013 at 12:52 PM by pwseo
leia Posted October 15, 2013 at 12:58 PM Author Report #529010 Posted October 15, 2013 at 12:58 PM Certo e verdade ,em termos de legibilidade usando o concat so me atrapalha mais. 🙂 Obrigada leia
pwseo Posted October 15, 2013 at 01:03 PM Report #529013 Posted October 15, 2013 at 01:03 PM (edited) leia, Se calhar isto nunca te ocorreu (sei que é comum os iniciados não se aperceberem disto), em Haskell a maioria do teu código pode ser simplificado de formas simples (de certa forma tal como simplificas expressões matemáticas). Ou seja, é claro que podemos escrever 3×a + 3×b + 3×c em vez de 3×(a+b+c), mas a segunda forma é mais legível e tem o mesmo significado. A questão do concat ali era precisamente a mesma. Continua com a aprendizagem, rapidamente ultrapassarás estas pequenas dificuldades se persistires 🙂 Edited October 15, 2013 at 01:04 PM by pwseo
leia Posted October 15, 2013 at 01:28 PM Author Report #529023 Posted October 15, 2013 at 01:28 PM Sim com certeza continuarei a insistir nisso!! obgd o apoio leia
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now