Functional vs Imperative: Round 1
April 27, 2008
Imperative in python
Functional on a object oriented flavor in ruby
Note: You can do the opposite, ruby in imperative and python in functional (I’m guessing on the python part, but it’s probably true)
# choose all values from a list that are not in a matrix
# imperative in python
res = []
for value in list:
present = False
for mlist in matrix:
if value in mlist:
present = True
break
if not present:
res.append(value)
# functional in ruby
res = list.select { |value| !matrix.flatten.member? value }
# restrict the matrix to values in list
# imperative strikes back
res = []
for mlist in matrix:
current_mlist = mlist[:]
for mvalue in mlist:
if mvalue not in list:
current_mlist.remove(mvalue)
res.append(current_mlist)
# functional responds
res = matrix.map do |mlist|
mlist.select { |mvalue| list.member? mvalue }
end





April 27, 2008 at 6:39 pm
O primeiro exemplo podes fazer em Python usando list comprehension.
O segundo não percebi o que faz. :P
April 27, 2008 at 6:43 pm
Listas por compreensão é uma coisa funcional. Ve da matematica não é? :P
Segundo, pequeno exemplo
m = [[1,2,3],[4,5,6]]
l = [2,3]
resultado = [[2,3],[]]
April 27, 2008 at 7:28 pm
http://docs.python.org/tut/node7.html#SECTION007140000000000000000
Neste caso,
>>> f = lambda list, matrix: [value for value in list if not value in matrix]
>>> f([1, 2, 3, 4], [2, 5, 6])
[1, 3, 4]
(podes tirar o lambda para executar logo)
Mas consegues fazer o mesmo usando o filter:
>>> matrix = [2, 5, 6]
>>> filter(lambda x: not x in matrix, [1, 2, 3, 4])
[1, 3, 4]
Para o segundo,
>>> matrix = [2, 3]
>>> map(lambda x: filter(lambda y: y in matrix, x), [[1, 2, 3],[4, 5, 6]])
[[2, 3], []]
April 27, 2008 at 7:32 pm
Sim mas o ênfase do post é no imperativo vs funcional.
Não interessa a linguagem. Tem lá uma nota
April 27, 2008 at 7:33 pm
Mas obrigado pelo código anyway
April 27, 2008 at 8:18 pm
Na boa, eu apenas dei este código porque o acho melhor do que o que escreveste em Ruby (em termos de beleza de código & afins). Um programador de Haskell ou LISP percebem mais rapidamente o meu code em Python do que o teu em Ruby. :)
April 27, 2008 at 8:29 pm
Eu sou um programador de Haskell e não reconheço nesse código nada parecido, até porque a notação é demasiado verbosa e pouco matemática. E listas em compreensão em haskell são algo totalmente diferente.
Já o código que forneci é igual em haskell, com a pequena particularidade do select se chamar filter e não ser orientado aos objectos:
map (\mlist => filter (\mvalue => member(mvalue,list)) mlist) matrix
(pode estar errado não tenho ghci nem paciência pra pormenores)
quanto ao lisp, não sei. Se bem que pelo pouco que conheço diria que estas errado.
Obrigado pelos comentários e dou-te o meu incentivo a usares este post para aprenderes um pouco mais sobre as maravilhas da programação funcional. Aconselho-te o Haskell :)
April 27, 2008 at 9:42 pm
Obrigado pela dica, mas já tenho um evangelista do Haskell a dizer-me isso há muito tempo. :P Quando tiver mais tempo e paciência, podes ter a certeza que vou experimentar. :)
(Quando me referi ao ser mais simples de perceber, era da última solução que dei para cada 1 dos problemas, já que os nomes são directos.)
April 27, 2008 at 10:15 pm
Posso dar-te algumas dicas, se quiseres aceitar…
Acho que devias usar a mesma linguagem para dar o exemplo, e principalmente não devias usar uma linguagem que claramente não dominas(Python).
Mesmo a parte imperativa podia ser muito mais simplificada, mas isso é outra história.
Outra dica é colocares o código dentro de um pre de forma manter as indentações. Neste post o código de Python não corre.
April 27, 2008 at 10:17 pm
O Python code não é meu. Estava a ler uma função com tanta linha de código e quando li os comentários pensei “mas é só para fazer isto?”.
E simplifiquei em Ruby. E aproveitei e escrevi um post a sugerir a programação funcional para quando de facto é mais “jeitosa” :P
Quanto a pre, o problema é deste tema do blog. Obrigado pelas dicas
May 26, 2008 at 11:35 am
O q tu queres sei eu! fofo*