notação soma em Haskell

votos
6

Na página da Wikipedia sobre somatório diz que a operação equivalente em Haskell é usar foldl . A minha pergunta é: Existe alguma razão pela qual ele diz para usar isso em vez de soma ? É mais um 'purista' do que o outro, ou há nenhuma diferença real?

Publicado 27/08/2009 em 07:16
fonte usuário
Em outras línguas...                            


6 respostas

votos
11

foldlé um general cauda-recursivo reduzir a função. Recursividade é a maneira usual de pensar sobre manipulação de listas de itens em um funcionais linguagens de programação, e fornece uma alternativa para iteração do loop que muitas vezes é muito mais elegante. No caso de uma função de reduzir como fold, a implementação cauda-recursivo é muito eficiente . Como já foi explicado, sumé então apenas um mnemônico conveniente para foldl (+) 0 l.

Presumivelmente, o seu uso na página wikipedia é para ilustrar o princípio geral do somatório através cauda-recursão. Mas desde que o Haskell Prelude biblioteca contém sum, que é mais curto e mais óbvia para compreender, você deve usá-la em seu código.

Aqui está uma boa discussão de Haskell foldfunções com exemplos simples que vale a pena ler.

Respondeu 27/08/2009 em 07:53
fonte usuário

votos
3

Não vejo onde diz nada sobre Haskell ou foldlem que página da Wikipedia, mas sumem Haskell é apenas um caso mais específico de foldl. Ele pode ser implementado como esta, por exemplo:

sum l = foldl (+) 0 l

Que pode ser reduzido para:

sum = foldl (+) 0
Respondeu 27/08/2009 em 07:26
fonte usuário

votos
2

Uma coisa a notar é que soma pode ser mais preguiçosos do que você gostaria, por isso, considerar o uso de foldl'.

Respondeu 27/08/2009 em 12:05
fonte usuário

votos
1

Como afirmado pelos outros, não há nenhuma diferença. No entanto, uma soma-call é mais fácil de ler do que uma dobra-call, então eu iria para sum, se você precisa somatório.

Respondeu 27/08/2009 em 07:44
fonte usuário

votos
0

O conceito de somatório pode ser alargado a outros tipos não numéricos: tudo que você precisa é algo equivalente a uma operação (+) e um valor zero. Em outras palavras, você precisa de um monoid . Isso leva à Haskell função "mconcat", que retorna a soma de uma lista de valores de um tipo monoid. O "mconcat" default de curso é definido em termos de "mappend", que é a operação mais.

Respondeu 30/08/2009 em 16:54
fonte usuário

votos
0

Não há diferença. Essa página é simplesmente dizendo que sumé implementado usando foldl. Basta usar sumsempre que precisar para calcular a soma de uma lista de números.

Respondeu 27/08/2009 em 07:38
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more