Este é o exemplo que me convenceu a aprender Haskell (e estou feliz por ter aprendido).
-- program to copy a file --
import System.Environment
main = do
--read command-line arguments
[file1, file2] <- getArgs
--copy file contents
str <- readFile file1
writeFile file2 str
OK, é um programa curto e legível. Nesse sentido, é melhor do que um programa C. Mas como isso é tão diferente de (digamos) um programa Python com uma estrutura muito semelhante?
A resposta é avaliação preguiçosa. Na maioria das linguagens (mesmo algumas funcionais), um programa estruturado como o anterior resultaria no arquivo inteiro sendo carregado na memória e, em seguida, escrito novamente com um novo nome.
Haskell é "preguiçoso". Ele não calcula as coisas até que precise e, por extensão , não calcula as coisas de que nunca precisa. Por exemplo, se você remover a writeFile
linha, Haskell não se incomodaria em ler nada do arquivo em primeiro lugar.
Do jeito que está, Haskell percebe que writeFile
depende do readFile
e, portanto, é capaz de otimizar esse caminho de dados.
Embora os resultados dependam do compilador, o que normalmente acontecerá quando você executar o programa acima é o seguinte: o programa lê um bloco (digamos, 8 KB) do primeiro arquivo, o grava no segundo arquivo e, em seguida, lê outro bloco do primeiro arquivo e grava no segundo arquivo, e assim por diante. (Tente correr strace
nele!)
... que se parece muito com o que faria uma implementação C eficiente de uma cópia de arquivo.
Portanto, Haskell permite que você escreva programas compactos e legíveis - muitas vezes sem sacrificar muito o desempenho.
Outra coisa que devo acrescentar é que Haskell simplesmente torna difícil escrever programas com erros. O incrível sistema de tipos, a falta de efeitos colaterais e, claro, a compactação do código Haskell reduzem os bugs por pelo menos três razões:
Melhor desenho do programa. A complexidade reduzida leva a menos erros lógicos.
Código compacto. Menos linhas para a existência de bugs.
Erros de compilação. Muitos bugs simplesmente não são Haskell válidos .
Haskell não é para todos. Mas todos deveriam tentar.