nunojob:~ dscape/08$ echo The Black Sheep

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

Comments on: "Functional vs Imperative: Round 1" (11)

  1. O primeiro exemplo podes fazer em Python usando list comprehension.
    O segundo não percebi o que faz. :P

  2. 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],[]]

  3. 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], []]

  4. Sim mas o ênfase do post é no imperativo vs funcional.

    Não interessa a linguagem. Tem lá uma nota

  5. Mas obrigado pelo código anyway

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

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

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

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

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

  11. eduardo said:

    O q tu queres sei eu! fofo*

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: