[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