Em uma entrevista com John Hughes, onde ele fala sobre Erlang e Haskell, ele tem o seguinte a dizer sobre o uso de bibliotecas com estado em Erlang:
Se eu quiser usar uma biblioteca com estado, geralmente construo uma interface sem efeitos colaterais sobre ela, para que eu possa usá-la com segurança no restante do meu código.
O que ele quer dizer com isso? Estou tentando pensar em um exemplo de como isso seria, mas minha imaginação e / ou conhecimento estão me falhando.
haskell
erlang
state
side-effect
beta
fonte
fonte
Respostas:
(Não conheço Erlang e não sei escrever Haskell, mas acho que posso responder)
Bem, nessa entrevista, é dado o exemplo de uma biblioteca de geração de números aleatórios. Aqui está uma possível interface com estado:
A saída pode ser
5 2 7
. Para alguém que gosta de imutabilidade, isso é totalmente errado! Deveria ser5 5 5
, porque chamamos o método no mesmo objeto.Então, o que seria uma interface sem estado? Podemos ver a sequência de números aleatórios como uma lista avaliada preguiçosamente, onde
next
realmente recupera a cabeça:Com essa interface, sempre podemos reverter para um estado anterior. Se duas partes do seu código se referirem ao mesmo RNG, elas realmente obterão a mesma sequência de números. Em uma mentalidade funcional, isso é altamente desejável.
Implementar isso em uma linguagem stateful não é tão complicado. Por exemplo:
Depois de adicionar um pouco de açúcar sintático para parecer uma lista, isso é realmente muito bom.
fonte
Um conceito-chave aqui é o do estado mutável externo . Uma biblioteca que não possui um estado mutável externo é livre de efeitos colaterais. Toda função em uma biblioteca depende apenas dos argumentos passados para ela.
Testes de torneira úteis que eu uso:
fonte