[Rio-pm] [Golf] Função drop Haskell
Eden Cardim
edencardim em gmail.com
Quarta Fevereiro 3 14:32:41 PST 2010
>>>>> "Daniel" == Daniel de Oliveira Mantovani <daniel.oliveira.mantovani em gmail.com> writes:
Daniel> Eu fiz em Perl, para ficar claro:
Daniel> <perl> sub drop { my ( $n, $xs ) = @_; if ( ref $_[1] ne
Daniel> 'ARRAY' ) { $n <= 0 ? return $_[1] : return substr( $_[1],
Daniel> $n );
Daniel> }
Daniel> if ( $n <= 0 || !@_ ) { return @{$xs};
Daniel> }
Daniel> else { shift @{$xs}; drop( ( $n - 1 ), $xs );
Daniel> }
Daniel> }
Daniel> </perl>
Só a título de curiosidade:
Na verdade, não é isso que acontece no caso de Haskell. A função drop
do Prelude tem o tipo Int -> [a] -> [a], que significa que ela recebe um
inteiro, e uma lista de qualquer tipo e retorna outra lista do mesmo
tipo. Strings em Haskell são arrays de caracteres (não um tipo como em
perl), então qualquer operação de lista é aplicável a uma string, C
também é assim. Logo, em perl a função seria algo como:
sub drop{$s=shift;splice(@_,- em _+$s)}
print drop(2, 1..5);
345
print drop(1, 1..5);
2345
print drop()
E mesmo assim isso não é equivalente porque splice modifica a lista
in-place, a modificação do @_ se propaga pro escopo do invocador da
função, e funções em haskell são imutáveis, etc...
Mas enfim, vamos à tacada:
sub drop{($s,$_)=@_;$_=[split//]if!ref;splice(@$_,-@$_+$s)}
60
--
Eden Cardim Need help with your Catalyst or DBIx::Class project?
Code Monkey http://www.shadowcat.co.uk/catalyst/
Shadowcat Systems Ltd. Want a managed development or deployment platform?
http://edenc.vox.com/ http://www.shadowcat.co.uk/servers/
Mais detalhes sobre a lista de discussão Rio-pm