O que seria um bom primeiro projeto de programação funcional? [fechadas]

19

O que seria um bom primeiro projeto de programação funcional?

Eu estou olhando para terminar com um estrondo no meu projeto de bacharel e quero terminar com um projeto de programação funcional. Nós não estudamos isso na escola, mas somos encorajados a tentar aprender coisas novas, e eu pensei que aprender um novo paradigma não apenas um novo idioma seria um ótimo exercício para mim, e provavelmente algo interessante para os professores também verem. .

O problema é que quero começar um pouco antes do tempo no meu projeto para aproveitar as férias de verão e entender melhor a programação funcional e me familiarizar com um idioma.

O que você diria que seria um projeto de boas práticas um pouco desafiador, mas também me permite aprender a linguagem, o paradigma etc. E então, o que você acha que seria um bom projeto (mais avançado) para o meu projeto de bacharel?

Sugestões para a melhor linguagem para começar ao entrar em programação funcional também seriam apreciadas.

Meme
fonte
1
"Qual idioma devo escolher" e as perguntas de seleção de projetos estão fora de tópico aqui. Consulte as Perguntas frequentes e esta meta discussão para obter mais detalhes.
Adam Lear

Respostas:

10

Geralmente é mais fácil se você optar por algo relativamente matemático ou lógico - as linguagens de programação funcionais geralmente são adequadas para aplicativos que representam alguma forma de transformação de uma entrada para uma saída.

Algumas idéias, em ordem aproximada de dificuldade:

  • Algoritmos genéticos - escreva um programa que evolua soluções para uma tarefa específica em que as soluções são representadas em uma DSL simples. Eu me diverti antes de construir pequenos robôs que caçam comida em uma grade 2D e desenvolvem diferentes tipos de estratégias

  • Analisando combinadores - construa uma biblioteca combinadora de analisadores que permita construir um analisador para um idioma arbitrário usando funções de ordem superior.

  • Se você realmente quer um desafio, pode tentar escrever um jogo de computador ... esteja ciente de que esta é uma tarefa complicada, pois os jogos têm uma enorme quantidade de estados mutáveis ​​que podem ser difíceis de gerenciar em um estilo de programação funcional. Espere aprender mais do que você sempre quis saber sobre mônadas, etc .....

Eu recomendaria o Clojure como uma linguagem funcional pragmática. Eu o uso há cerca de 18 meses e estou extremamente feliz com a escolha. Os principais motivos são:

  • Concorrência - O Clojure possui um sistema STM incrível que, a meu ver, o torna o melhor idioma do mundo no momento para simultaneidade com vários núcleos. Veja o vídeo em: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey se você quiser entender por que isso é tão especial
  • É um Lisp - portanto, devido à filosofia "código é dados", é fantástico para metaprogramação baseada em macro (programas que escrevem programas, algoritmos genéticos etc.)
  • Programação funcional pragmática - o estilo Clojure é muito funcional (muita ênfase em funções de ordem superior, sequências preguiçosas etc.), mas não é totalmente puro como Haskell. Existem muitas ferramentas legais para lidar com o estado da tabela e os efeitos colaterais
  • Dinâmico - o Clojure é um idioma dinâmico por padrão. Acho isso um grande impulso para a produtividade. No entanto, você pode opcionalmente adicionar dicas de tipo estático posteriormente, se desejar os benefícios de desempenho da digitação estática.
  • Totalmente compilado - o código Clojure é sempre respeitado (mesmo que você faça uma "avaliação") para obter um desempenho bastante decente - certamente melhor do que a maioria das linguagens dinâmicas que já usei.
  • Você obtém acesso a todas as bibliotecas e ferramentas no ecossistema da JVM gratuitamente. Portanto, diferentemente das linguagens acadêmicas que possuem bibliotecas muito limitadas, você pode acessar qualquer coisa no universo Java com bastante facilidade

Você pode experimentar o básico com muita facilidade com:

Mikera
fonte
Eu escolhi sua resposta para a pergunta porque ela respondeu a todas as minhas perguntas. Muito obrigado por reservar um tempo.
Meme
Haskell também tem STM; (
alternativa
@mikera: Por trabalhar com a JVM, você já tentou o ABCL? Eu tentei e fiz apenas um pequeno exemplo, mas quase não tenho experiência com ele. (Eu também tenho um livro Clojure na minha lista de tarefas, mas isso é outra história, estou curioso para saber se você tem alguma experiência trabalhando com ABCL e Java).
Giorgio
@Giorgio: ABCL parece ser uma implementação decente do Common Lisp na JVM. O OTOH Clojure tem as vantagens de ser projetado para a JVM, incorporando muito mais inovações "modernas" e tendo mais ímpeto da comunidade. Eu acho que realmente se resume a se você se preocupa em manter a compatibilidade com versões anteriores do Common Lisp ou não.
Mikera
9

Antes de começar a pensar em projetos específicos, comece aprendendo os conceitos básicos de programação funcional para ter uma boa idéia dos tipos de projetos que seriam adequados.

O melhor lugar para começar é provavelmente a Estrutura e Interpretação de Programas de Computador (SICP), que é baseada no dialeto do esquema do Lisp. Este é um texto clássico do CS, e o texto completo está disponível online (link fornecido).

Se você quiser ser sofisticado e usar uma linguagem funcional mais moderna que seja direcionada à JVM, dê uma olhada no Clojure. Existe até uma versão adaptada do SICP especificamente para Clojure .

Analisando o texto do SICP, você terá uma idéia de por que a programação funcional é tão adequada a certos tipos de tarefas, e os exercícios podem inspirar um projeto completo. Se você optar por seguir a rota Clojure e quiser examinar alguns projetos existentes, existem alguns bons links aqui .

Jason Lewis
fonte
Obrigado por fornecer o link para o livro. Vou ler isso para entender melhor.
Meme
Você já leu seu SICP hoje?
MattyD 27/05
3

Análise quantitativa

Se você acha que as finanças são interessantes, fazer algumas coisas importantes com programação funcional é uma boa combinação, pois é muito algorítmico. Estou falando de teoria de portfólio e coisas como taxas de sharpe e sortino, etc. Crie um aplicativo que analise os retornos de um fundo e forneça estatísticas, diagramas etc.

Eu recomendaria o F # apenas porque acho que é uma linguagem funcional fácil de iniciar, possui boas ferramentas e uma boa estrutura para apoiá-lo. Outras alternativas são lisp e clojure, mas são um pouco mais difíceis de aprender.

Homde
fonte
Em alto nível, é realmente verdade que você pode fazer muitas coisas de maneira funcional. As pessoas usaram linguagens funcionais para descrever pagamentos exóticos de opções, por exemplo. Mas, à medida que você desce às questões do nível do solo, como calcular PCA, resolver equações não lineares etc., os algoritmos se tornam cada vez mais iterativos e é melhor codificá-los da maneira antiga.
Quant_dev 27/05
1
Não diria que, na minha experiência, a análise quantitativa tem a ver com a execução de algoritmos ao longo de séries. Eu tenho implementado coisas quant em C # e foi muito alinhado com LINQ, pelo menos para o tipo teoria da carteira de coisas
Homde
E as implementações dos próprios algoritmos?
Quant_dev 27/05
Não vejo problema na maioria dos casos, não é? Faça o cálculo de uma proporção de sharpe, primeiro calcule um retorno anualizado de uma série de retornos e depois use esse valor com uma taxa e volatilidade livres de risco: (annualizedReturn - riskFreeRate) / volatilidade. Nada uma linguagem funcional não poderia lidar
Homde
E a calibração do modelo de precificação?
Quant_dev 27/05
3

Para começar, você pode tentar implementar um pequeno jogo de blackjack em F #. Este é um projeto de lição de casa atribuído durante este breve tutorial em vídeo . A solução também é fornecida na rede (e em um dos vídeos).

knb
fonte
2

Você pode escrever um intérprete para o esquema ou lisp com o OCaml.

davidk01
fonte
Observe também que há até um livro de haskell sobre esse esquema de escrita em haskell.
alternativa
2

Em qual linguagem funcional você estava pensando. Cada um tem características diferentes. A única linguagem que causou maior impacto em mim foi Haskell e eu sugiro que você faça o mesmo.


fonte
Eu estava pensando em F # honestamente principalmente porque na Dinamarca a Microsoft tudo é popular, mas quanto mais leio opiniões diferentes, duvido dessa decisão. Quero um idioma que me ajude a aprender o paradigma principalmente, e depois de ter certeza de que não é difícil aprender outro, se eu precisar ou quiser.
Meme
Depende fortemente de onde você está e o que faz. Para nós, as tecnologias de programação da Microsoft são inúteis, pois não suportam nossa plataforma principal. Mas discordo: se você quiser usar o F #, ótimo, mas abra uma nova pergunta específica sobre o F #.
Eu não quero usar isso. Ainda não tomei uma decisão. A pergunta sobre o idioma a ser usado era secundária, de qualquer maneira.
Meme
Nesse caso, encontre um projeto e peça recomendações sobre como resolvê-lo. Por exemplo, o Prolog é ótimo para pesquisa em árvore de decisão. Haskell é ótimo para correspondência de padrões. O Lisp é ótimo para construir e manipular programas Lisp em tempo de execução, dependendo dos seus dados.
0

Você também pode contribuir para algum projeto de código aberto.

Por exemplo, no projeto da linguagem de programação Frege , há muito trabalho a ser feito. Por exemplo, você pode se importar em portar bibliotecas Haskell básicas. Isso faria de você um especialista em Haskell enquanto trabalha nele.

Ingo
fonte