Quiero saber por qué los diseñadores de Haskell aceptaron permitir solo 10 niveles de precedencia? ¿Alguien ha encontrado insuficiente?¿Por qué la precedencia de Haskell tiene solo 10 niveles? ¿Es suficiente la cifra de 10?
Respuesta
Según mi leal saber y entender, es completamente arbitrario. Toda la documentación de la que soy consciente simplemente la declara como un hecho, sin elaboración ni justificación.
Pero, si lo piensas bien, ¿por qué otra cosa sería mejor? De acuerdo, digamos que 10 no es suficiente. Tienes (.)
que tiene la mayor fijeza y quieres algo más que se ajuste un poco más. Agrega un nivel adicional, por lo que su nuevo máximo es 10 (aunque la mayoría de las soluciones solo van a 9).
Ahora tiene 11 niveles de precedencia. (Eso es ridículo. Ni siquiera es gracioso.) ¿Cómo es esto menos arbitrario que 10? ¿Qué le impide agregar más? ¿Qué pasa si quieres niveles nuevos entre los existentes? Claro, puede seguir agregando más, hasta que finalmente se encuentre escribiendo infix↑ (ω + 2i)
y preguntándose dónde salió su vida.
El hecho es que la precedencia del operador es intrínsecamente bastante arbitraria. Hay algunas convenciones, cosas multiplicativas más vinculantes que aditivas, operadores lógicos que tienen una precedencia menor que las funciones con valores booleanos, como (==)
, pero que son algo limitadas, y por lo general no cubren más de unos pocos niveles. De lo contrario, la única forma de recordar las precedencias del operador es ... bueno, recordarlas, como simplemente memorizar cada una. No solo es una tarea ardua, sino que también puede hacer que el código sea opaco para otros que quizás no tengan todo memorizado también. La memoria de trabajo humana es un recurso muy limitado, por lo que cuanto menos detalles exigentes necesiten recordarse durante la codificación, mejor.
La mayoría de los usos de los operadores en Haskell, donde los asuntos de precedencia caen en uno de los varios grupos ásperas:
operadores Pseudosyntactic como el uso común de
($)
, que suelen necesitar extremadamente alta o baja prioridad para evitar conflictos con otros operadores.Expresiones que utilizan operadores estándar, o variaciones de los mismos, donde existen un puñado de niveles de precedencia estándar y los nuevos operadores generalmente deben compartir el mismo nivel en el que están basados.
Conjuntos de operadores especializados, como los de un EDSL, cuyos símbolos y niveles de precedencia se eligen típicamente para reflejar la naturaleza del EDSL y es poco probable que coexistan con otros conjuntos de operadores.
Todos ellos funcionan bien con solo unos pocos niveles de precedencia. Más importante aún, se caracterizan por ser efectivamente independientes de otros operadores o solo utilizarse junto con un conjunto muy limitado de otros operadores. Comience agregando más operadores y mezclándolos en expresiones únicas y muy pronto las personas comenzarán a usar paréntesis explícitos de todos modos porque no pueden recordar lo que ata más de cerca que qué. Hablando por mi cuenta, ya soy propenso a la paréntesis explícita al mezclar operadores de estilo EDSL (por ejemplo, los combinadores Arrow
) con los operadores lógicos porque normalmente no puedo recordar los niveles de precedencia exactos que cada uno tiene.
Así pues, habiendo establecido que: 1) un montón de niveles de precedencia adicionales no serían tan útil porque es demasiado como para no perder de vista, y 2) ningún límite recogemos va a ser igual de arbitraria. ¿por qué 10?Voy a adivinar "porque los valores de corrección son solo de un solo dígito".
Buena respuesta ("me pregunto dónde salió mal tu vida" en particular) pero creo que deberías haber pirateado al menos una referencia de Spinal Tap. –
@mu es demasiado corto: Ah, eso sería "la mayoría de las reparaciones solo pasan a 9". :) La mayoría de los amplificadores van a 10, sin embargo, dado que los músicos de rock tienden a contar desde 1, no 0. Pero el rango es equivalente. (En realidad, mucho del fraseo en ese párrafo imitaba las líneas de Spinal Tap, pero eso es más sutil) –
Supongo que cuando uno cuenta los niveles que uno necesita para los números (aditivo, multiplicativo, exponencial), operadores relacionales y operadores lógicos (&&, ||) uno ya tiene seis niveles (tal vez siete, si quiere 'a Ingo
La cantidad de niveles es arbitraria y, como recuerdo, la decisión fue que muchos niveles hacen difícil recordar cómo interactúan los operadores. Por ejemplo, Prolog permite 1000 niveles, pero nunca he encontrado que sea mucho mejor que Haskell.
Extender Haskell tiene precedencias con los niveles que podría imaginar cambiando a un número racional, de esa manera siempre puede adaptarse a un operador entre dos operadores existentes. Pero una mejor opción sería cambiar a las precedencias siendo un orden parcial. Entonces, dados dos operadores, pueden relacionarse y luego manejarse en consecuencia, o sin relación, lo que forzaría el paréntesis.
Honestamente, el orden parcial parece más cercano a cómo realmente lo pienso. Aunque no estoy seguro de cómo eso manejaría operadores como '($)', donde solo querría que fuera "más bajo que la mayoría de los demás operadores". Simplemente tener mayores/menos precedentes únicos parece bastante inflexible. –
@camccann No he visto una solución satisfactoria para esto todavía. Así que estamos atrapados con lo que tenemos, que es aún mejor que la mayoría de los idiomas. – augustss
Aww, esperaba que hubieras imaginado esa parte también. :] Oh bien. La forma en que es ahora parece bastante cercana a un máximo local para la relación potencia/complejidad. –
- 1. ¿Por qué es la capacidad predeterminada de ArrayList 10?
- 2. ¿Por qué la volatilidad no es suficiente?
- 3. ¿Por qué fallo Project Euler # 10?
- 4. 10 * 10 veces la validación cruzada en scikit-learn?
- 5. ¿Por qué `logBase 10 x` es más lento que` log x/log 10`, incluso cuando está especializado?
- 6. El uso de la variable compartida por 10 pthreads
- 7. ¿Cómo seleccionar registros solo si la tabla unida tiene un conteo mayor a 10?
- 8. preguntando por 10 millones de documentos mongodb
- 9. Incrementando la tabla MySQL por 10 por algún motivo
- 10. Cuál es la diferencia entre el nuevo char [10] y el nuevo char (10)
- 11. ¿Por qué es mejor tener 100 funciones operan en una estructura de datos de 10 funciones en la estructura 10 de datos
- 12. La columna de autoincrement de MySQL salta por 10, ¿por qué?
- 13. ¿Por qué InverseFunction [0 &] @ 0 devuelve 33/10?
- 14. SQL Server VARCHAR (10)
- 15. En Flash Player 10 con vectores, ¿por qué usarías Arrays?
- 16. JS prueba si es múltiplo de 10
- 17. int x = 10; x + = x--; en .Net - ¿Por qué?
- 18. ¿Cuál es la característica en Ruby que permite "p * 1..10" imprimir los números del 1 al 10?
- 19. Función de función de infijo Haskell precedencia
- 20. ¿Por qué Excel traduce `= 10 ** - 2` a` = 0.1`?
- 21. Conversión de Base 36 a Base 10 usando solo SQL
- 22. MSVC-10 Include Paths
- 23. validación cruzada 10 veces
- 24. C++ rápida división/mod por 10^x
- 25. Haskell operador vs función precedencia
- 26. ¿Por qué reportviewer 10 rinde informes tan lentamente?
- 27. Android Cambiar la imagen cada 10 segundos
- 28. estratificado 10 veces la validación cruzada
- 29. ¿Qué significa 10.D00 en Fortran?
- 30. Cadena de formato de 10 caracteres
Agregar el nivel 11 sería un efecto secundario O.o –
Porque Nigel Tufnel no conoce a Haskell. –