2011-06-05 9 views
26

"Programación En Scala" explica que¿Por qué los índices de Scala tuples están basados ​​en 1?

números _N tuplas están basados ​​en uno, en lugar de base cero, porque a partir de 1 es una tradición establecida por otros idiomas con tuplas de tipos estáticos tales como Haskell y ML

pero esto no puede ser llamado una explicación .

¿Por qué las tuplas se definieron como basadas en 1 en Haskell y ML en primer lugar? ¿Hay algún beneficio matemático/de programación en tener tuplas indexadas basadas en 1 y no basadas en 0?

Gracias, Ori

+5

La indexación basada en 1 se ha demostrado matemáticamente que es más rápida. –

+1

@pelotom, diría que 0 es más rápido. La única diferencia es que en 1, por ejemplo, escribirás 10 en lugar de 9 para el décimo elemento. ¡Y 10 es un personaje más para leer y analizar que 9! ;-) – aioobe

+2

@aioobe: por supuesto, "10" es * mucho * más lento de analizar que "9", pero ¿con qué frecuencia estás accediendo al décimo elemento de una tupla? Para el caso común, "1" proporciona un acceso mucho más rápido al primer elemento de la tupla, debido al simple hecho de que requiere menos píxeles para dibujar que "0". –

Respuesta

19

supongo _1, etc _2 es la abreviatura de "primero", "segundo", y así sucesivamente. (fst y snd, por ejemplo, se han utilizado históricamente para acceder a la parte izquierda y derecha de una tupla). El índice de la matriz por el contrario es un desplazamiento y el primer elemento es por lo general en el desplazamiento 0.

¿Hay beneficios matemáticos/programación en que tiene de 1 a base de tuplas indexados y no 0- ¿basado?

No. Los elementos no se accede mediante programación de todos modos. (No puede hacer _i si i es un número entero.)

+7

Todo correcto hasta la última oración. Se puede acceder a los elementos mediante programación utilizando Product.productElement (n) ...con n 0-based, así por ejemplo tuple.productElement (3) == tuple._4 – jsalvata

4

Quizás Haskell y ML usaron tuplas basadas en 1 porque COBOL, Algol, and FORTRAN used 1-based arrays. La tradición es algo gracioso ...

+3

Algol68 permitió al programador indexar una matriz desde cualquier límite inferior, el valor predeterminado era 1. c.f. Van Wijngaarden: "Déjame venderte un idioma", comenzó, y procedió a delinear las ideas detrás del lenguaje. Él mostró algunos ejemplos. "¿Puedes definir arreglos triangulares?", Interrumpió alguien (¿Tony Hoare?). "No solo triangular, sino incluso elíptica", respondió Aad, y mostró cómo "de" La realización de ALGOL 68 "http://www.cs.ru.nl/~kees/home/papers/psi96.pdf – NevilleDNZ

+1

@ NevilleDNZ, lectura divertida, gracias! – sarnold

3

0 las cosas basadas son geniales cuando quieres hacer cálculos matemáticos con el índice. Simplemente no funciona con 1 índices basados.

Sin embargo, para todos menos geeks de la computadora 1 basado es mucho más natural.

Las tuplas están destinadas a contener cosas completamente diferentes. Hacer algo así como agregar el índice de este elemento y agregarlo al índice de ese elemento y obtener el elemento con el índice resultante no tiene sentido para las tuplas.

Por lo tanto, yo diría que las tuplas están basadas en 1, porque es lo más natural y no hay ninguna razón para no hacerlo.

+11

Bueno, los usuarios de Scala tuples * son * "geeks de computadoras" :) El resultado de tener dos tipos de esquemas de indexación en el mismo idioma es que todavía hay una cosa más para recordar, que me resulta un poco molesto. – Ori

Cuestiones relacionadas