Pergunta

Eu tenho um problema, que eu acredito ser melhor resolvidos através de um estilo funcional de programação.

Vindo de um fundo muito imperativo, estou habituado a concepção do programa envolvendo diagramas de classe / descrições, diagramas de comunicação, estado diagramas etc. Esses diagramas No entanto, todas implicam, ou são usados ??para descrever o estado de um sistema e as diferentes efeitos colaterais que as ações têm sobre o sistema.

Há algum conjunto padronizado de diagramas ou símbolos matemáticos utilizados na concepção de programas funcionais, ou são esses programas mais bem projetados em código funcional pseudo-curta (dado que as funções será muito mais curto do que congéneres imperativas).

Obrigado, Mike

Foi útil?

Solução

Há um truque secreto para programação funcional.

  1. É em grande parte sem estado, de modo que os diagramas imperativas tradicionais não importam.

  2. A maioria de notação matemática comum, jardim-variedade também apátrida é.

Design funcional é mais como álgebra do que qualquer outra coisa. Você está indo para definir funções e mostram que a composição dessas funções produz o resultado desejado.

Os diagramas não são tão necessários porque a programação funcional é um pouco mais simples do que a programação procedural. É mais como notação matemática convencional. Use técnicas matemáticas para mostrar que suas várias funções fazer as coisas certas.

Outras dicas

programadores funcionais são mais em escrever equações em seguida, escrever diagramas. O jogo é chamado equational raciocínio e envolve principalmente

  • A substituição é igual para iguais

  • A aplicação de leis algébricas

  • A prova ocasional por indução

A idéia é que você escrever código muito simples que é "manifestamente correcta", então você usar o raciocínio equational para transformá-lo em algo que é mais limpo e / ou terá um desempenho melhor. O mestre desta arte é um professor de Oxford chamado Richard Bird.

Por exemplo, se eu quiser simplificar a expressão Esquema

(append (list x) l)

Vou subsitute iguais para iguais como louco. Usando a definição de list I get

(append (cons x '()) l)

Subsituting o corpo de acrescentar que tenho

(if (null? (cons x '())) 
    l
    (cons (car (cons x '())) (append (cdr (cons x '())) l)))

Agora eu tenho essas leis algébricas:

(null? (cons a b)) == #f
(car   (cons a b)) == a
(cdr   (cons a b)) == b

e substituindo iguais para iguais I get

(if #f
    l
    (cons x (append '() l))

Com uma outra lei, (if #f e1 e2) == e2, recebo

(cons x (append '() l))

E se eu gastar a definição de anexar novamente I get

(cons x l)

que tenho provado é igual a

(append (list x) l)

Eu não sei muito sobre programação funcional, mas aqui estão duas coisas que eu correr em

  • ? (lambda) é frequentemente utilizado para designar um função
  • f ? g é utilizado para indicar a função composição
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top