2011-04-07 17 views
9

Mathematica 6 añadido TakeWhile, que tiene la sintaxis:¿Dónde está DropWhile en Mathematica?

TakeWhile [lista, crit] da elementos e i desde el comienzo de lista, continuando mientras crit [e i] es True.

Sin embargo, no existe la función "DropWhile" correspondiente. Se puede construir DropWhile usando LengthWhile y Drop, pero parece casi desaconsejado utilizar DropWhile. ¿Por qué es esto?

Para aclarar, no estoy pidiendo una forma de implementar esta función. Más bien: ¿por qué no está ya presente? Me parece que debe haber una razón para su ausencia que no sea un descuido, o ya habría sido corregido. ¿Hay algo ineficiente, indeseable o superfluo sobre DropWhile?


Parece que hay cierta ambigüedad acerca de la función de DropWhile, por lo que aquí es un ejemplo:

DropWhile = Drop[#, LengthWhile[#, #2]] &; 

DropWhile[{1,2,3,4,5}, # <= 3 &] 
Out= {4, 5}
+1

Sobre la "ambigüedad". Esta es solo una ambigüedad de lenguaje de la palabra "while". Deberíamos seguir el significado estándar de "while" utilizado en funciones como 'While' en * Mathematica *. Entonces su problema podría reescribirse como 'list = {1, 2, 3, 4, 5}; Mientras [list [[1]] <= 3, list = Drop [list, 1]]; lista'. No hay ninguna ambigüedad como puedo ver. –

+0

@Alexey, mi edición fue en respuesta a una respuesta que sugería un método que no estaba de acuerdo con la definición anterior. Desde entonces ha sido eliminado. –

Respuesta

3

Las listas omnipresentes en Mathematica son vectores de longitud fija, y cuando son números de máquina, es una matriz empaquetada.

Por lo tanto, las funciones naturales para una lista vinculada recursivamente definida (por ejemplo, en Lisp o Haskell) no son las herramientas principales en Mathematica.

Me inclino a pensar que esto explica por qué Wolfram no completó su repertorio de funciones de manipulación.

7

Sólo una conjetura ciega.

Hay muchas operaciones de la lista que podrían tomar un mientras que criterios. Por ejemplo:

Total..While 
Accumulate..While 
Mean..While 
Map..While 
Etc..While 

No son difíciles de construir, de todos modos.

Creo que no se incluyen solo porque el número de funciones "primitivas" ya está creciendo demasiado, y el criterio de "¿es frecuentemente necesario y difícil de implementar con un buen rendimiento por parte del usuario?" prevalece en esos casos.

+0

Según esta lógica, ¿no estaría 'TakeWhile' también ausente ya que se puede construir desde' LengthWhile'? Me parece que 'Take' y' Drop' van juntas como un par, y creo que otros lenguajes que implementan esto tienen tanto takeWhile como dropWhile.Creo que me gusta la idea de MapWhile, por cierto. –

+1

@Mr. Creo que la existencia de TakeWhile y LengthWhile no es curiosa porque la ortogonalidad no es el criterio prevaleciente para la implementación de funciones en WR. Sin embargo, solo estamos despotricando aquí. Solo quiero agregar que he tenido que hacer mi propio dropWhile bastantes veces :) –

+0

Me pregunto si la explosión podría ser dominada haciendo que las diferentes funciones acepten un segundo parámetro alternativo (o el que sea) que indique la prueba a ser realizado. De esa forma haría 'Take', etc., ortogonal a su generador de condiciones. – rcollyer