Modelos mentais ou metáforas do mundo real para programação funcional

16

Alguém tem um bom modelo mental ou metáfora para programação funcional que faça referência a algo no mundo real?

A programação orientada a objetos intuitivamente faz sentido para mim. Existem coisas que têm propriedades e, às vezes, elas também podem fazer coisas ou executar cálculos em suas propriedades (métodos). (Ex: Carro, Forma, Gato).

Não agüento programação funcional e não estou interessado em um debate sobre as virtudes dos dois. Eu só preciso de uma metáfora ou modelo mental para trabalhar como tenho com a programação orientada a objetos.

Quais são alguns bons modelos mentais ou metáforas do mundo real para a programação em um paradigma funcional? Há algo sobre funções compostas de funções que processam funções que deixam alguém sem um lugar firme para se posicionar e cogitar.

Guido Anselmi
fonte
A que significado concreto de "programação funcional" você se refere "sem efeitos colaterais / declarativo" ou "funções de primeira classe / composição de funções"? Ou ambos?
acelent
Pergunta interessante. Com meu pequeno conhecimento atual e pouca experiência em programação em "programação funcional", não posso responder significativamente a essa pergunta. Se eu tivesse que adivinhar um palpite, diria os dois.
Guido Anselmi
13
O modelo do "mundo real" é frequentemente dado como uma motivação para a programação orientada a objetos. Eu acho que é uma abordagem que você deve superar, porque os objetos no OOP nem sempre devem corresponder aos objetos do mundo real e, mesmo quando o fazem, a correspondência geralmente é incompleta; por exemplo, os relacionamentos "é-a" nem sempre são os mesmos. Por outro lado, quando você diz que deseja um modelo ou metáfora para uma linguagem de programação baseada em algo do "mundo real", acho que você se restringiu a essa forma limitada de OOP.
David K
Um modelo mental realmente bom, se você tiver experiência em usar sistemas do tipo Unix (ou o PowerShell no Windows moderno), é o shell one-liners. Eles não são exatamente os mesmos, já que os shell pipes são tecnicamente programação baseada em fluxo em vez de funcional, mas têm a mesma "sensação" de um programador.
slebetman
1
Além disso, você encontrará à medida que aprende linguagens funcionais, na programação funcional, a orientação a objetos é tratada como uma ferramenta, como expressões regulares, por exemplo. Algo que você pode usar se quiser, mas não precisa. Em alguns idiomas, como lisp e tcl e adiante, o OO não é um recurso incorporado ao idioma, mas uma biblioteca que você pode usar (ou pode escrever seu próprio OO, se se sentir corajoso). Portanto, problemas que naturalmente possuem uma solução OO podem ser resolvidos usando OO na maioria das linguagens funcionais. As pessoas simplesmente não tratam OO como uma religião.
slebetman

Respostas:

32

A programação funcional consiste em colar funções menores para alcançar seus resultados. Um modelo mental decente (para mim, pelo menos) é uma linha de montagem. Cada função que é composta é mais uma etapa no processo de montagem. Considere esta função aqui:

smallest  = head . sort

No Haskell, essa função retornará o menor elemento de uma lista. A linha de montagem classifica primeiro a entrada e, em seguida, retorna o primeiro elemento (supondo que seja classificada da menor para a maior). Se quisermos obter apenas o menor valor par, podemos alterar a linha de montagem para ter a seguinte aparência:

smallestEven = head . sort . filter even

É apenas mais um passo na correia transportadora.

Em poucas palavras, as funções descrevem apenas as etapas adotadas para converter a entrada bruta (as partes) na mercadoria processada (a saída).

bstamour
fonte
2
Em uma linguagem funcional pura, sem variáveis ​​globais, uma linha de montagem não pode afetar a outra (a menos que esteja alimentando a entrada da outra linha). Teoricamente, qualquer linha de montagem que não dependa uma da outra pode ser executada em paralelo, mas não estou verifique se algum compilador faz isso.
bstamour
3
@GuidoAnselmi Uma maneira de pensar sobre isso é que a linha de montagem na programação funcional cria novas saídas enquanto deixa as entradas intactas, enquanto a linha de montagem na OOP tradicional transforma a entrada.
Doval
2
Essa metáfora só faz sentido no significado de "funções de primeira classe / composição de funções" de "programação de funções", não no "sem efeitos colaterais / declarativo". Além disso, a programação orientada a objetos não tem necessariamente efeitos colaterais; portanto, você pode implementar uma linha de montagem destrutiva ou construtiva com OOP ou com esse significado de FP. POO é mais sobre encapsulamento, passagem de mensagens e polimorfismo do que sobre efeitos colaterais, depende de como você modela as coisas. Por exemplo, você precisa de identidade referencial do início ao fim?
acelent
3
@ bstamour: Para ser preciso, deve-se escrever que (f . g) (x)significa f(g(x))ou f . gsignifica \x -> f (g (x)).
Giorgio
3
@MarjanVenema As coisas fluem nesse exemplo apenas porque é assim que .é definido; não é assim que Haskell funciona em geral . Você também pode definir o operador de canal direto do F # ( |>) em Haskell e escrever smallest x = (sort x) |> heade os dados fluirão corretamente. Apenas pensei em apontar isso.
Doval
18

Alguém tem um bom modelo mental para programação funcional?

Matemática.A programação funcional é inspirada e modelada em matemática. As funções matemáticas não têm estado, não têm efeitos colaterais, etc., e assim é com o FP. Se você pensar em FP em termos de funções matemáticas, em vez de usar uma abordagem "como faço isso para isso" no estilo OO, você estará em boa forma. Se você tentar trazer sensibilidades de OO para FP, no entanto, estará nadando contra a corrente.

Caleb
fonte
1
Obrigado. No entanto, preciso de uma metáfora do mundo real (por exemplo, não de computadores ou matemática).
Guido Anselmi
3
@GuidoAnselmi: Uma função é uma caixa preta. Você coloca algo de um lado e, em seguida, algo novo sai do outro lado. Se você colocar as mesmas coisas, sempre as tirará. Você pode pegar muitas dessas caixinhas e combiná-las em ordens diferentes para construir uma fábrica que possa absorver metais brutos e produzir um carro. No interior, o processo é dividido em vários pedaços, mas do lado de fora é apenas outra função.
Daenyth
16

Que tal um flip book ?

Em um flip book, cada página representa o mundo como ele existe no momento. Em nosso programa, o mundo é representado como uma estrutura de dados composta (por exemplo, temos uma banana que está na mão de um gorila que está em uma árvore que está em uma floresta). Cada página subsequente avança a história modificando ligeiramente a representação anterior. No FP, as estruturas de dados persistentes foram projetadas para reutilizar eficientemente as estruturas anteriores, de modo que uma mudança forneça apenas um delta e não uma renderização completamente nova.

O que pode não ser óbvio é que uma página do nosso flip book também representaria intangíveis. Por exemplo, se o gorila deixa cair a banana, podemos começar a aplicar os efeitos da gravidade em sua decente e aceleração em direção ao solo da selva. Para acomodar isso, atribuímos atributos como velocidade e trajetória à nossa banana.

Em nosso programa, haveria uma função que aceita uma página de flip-book (também conhecida como o estado do mundo) como argumento e gera uma nova página . Dessa maneira, nossa história é contada sem jamais alterar o estado dos objetos existentes. Simplesmente substituímos cada página por uma mais nova, usando o que é efetivamente um cálculo.

Mario T. Lanza
fonte
3

Relacionamentos.

Amigo: Dadas duas pessoas, um relacionamento de amigo segue estas leis gerais

  1. Tenha boa vontade um com o outro
  2. Acha que os outros são amigos deles (então as leis devem ser cumpridas pelos dois membros nesse relacionamento)
  3. Gosta de passar tempo juntos

Monóide: dados vários itens e uma função que pega 2 dos itens e retorna 1, um relacionamento monoidal segue estas leis gerais

  1. Há um desses itens (apenas um, chamado identidade) que passou para a função com qualquer outro item garantirá que a função sempre retorne o outro item (0 + 1 = 1, portanto, 0 é a identidade quando os itens são números e o função é adição)
  2. A função não pode operar ou devolver itens que não estão no conjunto com uma relação monoidal com
  3. A função é associativa e pode ser usada com os itens de maneira um tanto independente da ordem, ou seja, a * (b * c) = (a * b) * c que diz que você pode multiplicar a pelo resultado de b * c ou c pelo resultado de a * be o resultado será o mesmo que você fizer primeiro.

A programação funcional é sobre generalizações, o amigo é um relacionamento muito geral que pode ser visto em vários cenários, mas em todos os vários formatos geralmente segue as leis acima.

Reconhecendo as leis que governam os relacionamentos entre as coisas, você pode criar implementações gerais que funcionam em qualquer formato de coisas que possua esse tipo de relacionamento. Na programação funcional, você tenta identificar os relacionamentos entre as coisas, para que elas possam ser classificadas e tratadas em geral.

Você quer uma metáfora do mundo real? Veja como as coisas estão relacionadas e tente identificar leis gerais (como aplicável a vários cenários em que outras coisas que não as leis podem variar). Existe um relacionamento entre um registrador e um comprador em uma loja, ele possui algumas leis gerais, um software foi desenvolvido para facilitar os objetivos das pessoas nesse relacionamento geral na forma de sistemas POS. Da mesma forma, quando você começa a ver essas leis gerais determinando como as coisas estão relacionadas, pode começar a confiar nas leis desses relacionamentos ao escrever seu software, em vez dos detalhes específicos de uma instância de um relacionamento.

Jimmy Hoffa
fonte
2

Tudo é um valor, e você aplica funções aos valores (que podem ser funções) para produzir novos valores, de preferência sem produzir efeitos colaterais.

Doval
fonte
Obrigado. Infelizmente, isso parece mais uma descrição do que um modelo ou metáfora mental. Eu preciso de uma metáfora do mundo real (não dos computadores).
Guido Anselmi
1
Como Caleb aponta , a programação funcional modela a matemática, não o mundo real. Pode modelar o mundo real através das lentes da matemática, mas você provavelmente não encontrará uma metáfora que o satisfaça, porque FP evita o conceito de coisas com uma identidade persistente e um estado mutável. Se você quiser, posso apontar como o OOP constrói o mapa para o FP, mas essa ainda não será a resposta que você deseja.
Doval
Mas a matemática é baseada no mundo real. 1 sol, 9 planetas. 2 maçãs mais 2 maçãs fazem quatro maçãs.
Guido Anselmi
E na programação funcional, você também pode ter um tipo de sóis, planetas e maçãs, criar um valor do tipo sol, 9 valores do tipo planeta e definir adição para o tipo de maçã.
Doval
3
@GuidoAnselmi você tem tudo ao contrário, as pessoas analisam o mundo real com a matemática, não tem base no mundo real. A matemática é usada para analisar e definir relações entre todos os tipos de coisas, reais e não. 9 planetas é você aplicando uma construção matemática (o conjunto de números naturais) a uma construção do mundo real (planetas) com uma função de análise matemática (contagem). O mundo real não tem 9 planetas, tem o que tem, a matemática apenas fala sobre representações simbólicas de coisas nas quais os símbolos têm relações entre si.
Jimmy Hoffa
1

O principal a perceber sobre a programação funcional é que tudo é um valor - até o próprio código é 'valores'.

O melhor exemplo de um ambiente de programação funcional simples é o da ferramenta de negócios favorita de todos - a planilha. Cada célula da planilha é de dados ou o resultado de uma função. Além disso, essa função não pode ser desativada e modificar outra célula.

Quando se move para uma linguagem funcional, em vez de uma grade cartesiana de A1e B42, as funções têm nomes. Isso é tudo o que realmente é.

Existem outros aspectos que podem ser adicionados além disso ... mas essa é a programação funcional em sua essência. Não é preciso se preocupar com a estrutura das listas ou o agrupamento de coisas. A programação funcional é sobre passar um valor para uma função e recuperar um valor sem ter que mexer em outro lugar na memória.

É isso aí. A programação funcional é uma planilha com nomes e não uma grade.


fonte
0

Você pode pensar em programação funcional como sobre comportamentos . Um programa é uma descrição do comportamento que você deseja que o computador decida. As funções são a unidade básica de comportamento, e a composição das funções é uma maneira de criar comportamentos maiores a partir dos menores.

No OOP, um objeto de código deve ser o estado de um objeto no domínio do problema; muda ao longo do tempo para refletir as alterações nesse objeto de domínio. No FP, um valor representa o estado de um objeto de domínio; isso nunca muda, você simplesmente cria valores diferentes para representar estados diferentes.

Acho o modelo funcional um pouco mais honesto sobre o que os computadores estão realmente fazendo - representando. Afinal, eu não posso simplesmente conjurar um new Tesla()nada. :)

Jon Purdy
fonte
-5

As frases são mais funcionais do que orientadas a objetos, supondo que você as descreva mais ou menos como as seguintes ...

The brown cow is in the meadow across the deep river.

Então, precisamos encontrar as frases principais e o resto:

The cow (brown)
the meadow (across)
the river (deep)

Numa única tentativa:

sentence: The cow ((the meadow (the river (deep)) (across)) brown)

Árvore de análise:

|                     sentence
|                      /         
|                  The cow
|                 /       \
|            the meadow   brown
|            /         \
|      the river      across
|              \
|              deep

A parcimônia infecta o pensamento funcional;

Tiremos o chapéu para Gottlieb Frege, década de 1890, Alan Turing (entschiedungsprobleme), década de 1930, Noam Chomsky (década de 1960).

KTys
fonte
4
Esta é uma explicação confusa e, para começar, estou familiarizado com o FP.
Daenyth
Looks como imitando a forma de Lisp sem entender o significado
Izkata