Estoy tratando de verificar algo para mí sobre el operador y la precedencia de función en Haskell. Por ejemplo, el siguiente códigoHaskell operador vs función precedencia
list = map foo $ xs
se puede reescribir como
list = (map foo) $ (xs)
y con el tiempo será
list = map foo xs
Mi pregunta solía ser, ¿por qué la primera formulación no se puede reescribir como
list = (map foo $) xs
ya que la precedencia de la función siempre es mayor que la precedencia del operador, pero creo que he encontrado la respuesta: simplemente no se permite que los operadores sean argumentos de funciones (excepto, por supuesto, si los rodean con paréntesis). ¿Es esto correcto? Si es así, me parece extraño que no haya mención de esta mecánica/regla en RWH o Learn You a Haskell, o en cualquiera de los otros lugares que he buscado. Entonces, si conoce un lugar, donde se establece la regla, por favor enlace a él.
- editar: Gracias por sus respuestas rápidas. Creo que mi confusión vino de pensar que un operador literal de alguna manera evaluaría algo, que podría ser consumido por una función como argumento. Me ayudó a recordar que un operador infijo se puede traducir mecánicamente a funciones de prefijo. Hacer esto a los primeros rendimientos de formulación
($) (map foo) (xs)
donde no hay duda de que ($) es la función que consume, y puesto que las dos formulaciones son equivalentes, entonces los $ literal en la primera formulación no puede ser consumido por el mapa.
Gracias. Después de leer tu respuesta, cuando dices que mi pregunta es un poco confusa, entiendo que mi mención de "función de precedencia" es incorrecta, y que las funciones en sí mismas no tienen ninguna precedencia, sino que pueden considerarse como argumentos para el operador de la aplicación, espacios en blanco. ¿Es esto correcto? Todavía no estoy del todo claro sobre cómo caben los operadores de infijo en esto. He editado mi pregunta para reflejar cómo puedo pensarlo mejor. ¿Es este entendimiento correcto? – Boris
No, no del todo. Las funciones y los operadores son indistinguibles en Haskell. Ambos pueden tener diferentes niveles de precedencia, especificados por el usuario. –
Ok. Todavía estoy intentando descubrir la regla general, que lleva a list = (map foo) $ (xs) en lugar de list = (map foo $) xs, que sé que es una sección. Podría decirse que, al decidir, para una expresión dada, qué argumentos pertenecen a qué funciones y operadores, las funciones consumen, comenzando desde la izquierda, todos los argumentos que pueden, hasta que llegan a un operador.Después de esto, los operadores consumen sus argumentos, de acuerdo con su precedencia y asociatividad (Esto es un poco vago, pero espero que lo entiendas). Lo siento, si esto parece obvio, pero nunca fue muy claro para mí. – Boris