2012-05-11 17 views

Respuesta

16
+10

Upvoted, pero con una advertencia: ':' * is * permitido en los nombres de los operadores. Si es el primer carácter, entonces el operador nombra un constructor, de lo contrario nombra una función como normal. – dave4420

+0

¡No sabía de eso! –

+0

¡Esto es completamente loco! Es genial que sea posible utilizar símbolos Unicode, pero desafortunadamente suelen ser muy difíciles de escribir en los teclados actuales. – Qqwy

27

De los Haskell 2010 Report §2.4:

símbolos de operador se forman a partir de uno o más caracteres de símbolos ...

§2.2 define los caracteres de símbolos como cualquiera de !#$%&*+./<=>[email protected]\^|-~: o "cualquier [ non-ascii] Símbolo o puntuación Unicode ".

+2

Interesante que puede utilizar Unicode arbitrario. Entonces, por ejemplo, λ o ⊗ serían operadores Haskell válidos? –

+12

No, 'λ' es una letra Unicode, no un símbolo Unicode o un carácter de puntuación Unicode. Por lo tanto, no puede usarlo como parte de un nombre de operador (pero puede usarlo como parte de un identificador ordinario). – dave4420

+2

Espero que puedas usar '⊗' como operador de Haskell, pero no estoy seguro. – dave4420

48

Desde el haskell report, esta es la sintaxis para los símbolos permitidos:

special -> (|) | , | ; | [ | ] | `| { | } 
symbol  -> ascSymbol | uniSymbol<special | _ | : | " | '> 
ascSymbol -> ! | # | $ | % | & | * | + | . |/| < | = | > | ? | @ 
       \ |^| | | - | ~ 
uniSymbol -> any Unicode symbol or punctuation 

Así, los símbolos son símbolos ASCII o símbolos Unicode a excepción de los de special | _ | : | " | ', los cuales están reservados (aquí a | b significa "puede ser a o b ", y a<b> significa" puede ser todo en a excepto b "). Unos pocos párrafos siguientes, el informe da la definición completa para los operadores Haskell:

varsym  -> (symbol {symbol | :})<reservedop | dashes> 
consym  -> (: {symbol | :})<reservedop> 
reservedop -> .. | : | :: | = | \ | | | <- | -> | @ | ~ | => 

símbolos de operador se forman a partir de uno o más caracteres de símbolos, como definido anteriormente, y se distinguen léxicamente en dos espacios de nombres (Sección 1.4):

  • Un símbolo de operador que comienza con dos puntos es un constructor.
  • Un símbolo de operador que comienza con cualquier otro carácter es un identificador ordinario.

Observe que un dos puntos por sí mismo, ":", está reservado únicamente para el uso como Haskell list constructor; esto hace que su tratamiento sea uniforme con otras partes de sintaxis de lista, como "[]" y "[a, b]".

Aparte de la sintaxis especial para la negación de prefijo, todos los operadores son infijo, aunque cada operador infijo se puede utilizar en una sección para producir operadores parcialmente aplicados (ver Sección 3.5). Todos los operadores de infijo estándar son solo símbolos predefinidos y pueden recuperarse.

+6

Probablemente debería estar citando el informe [haskell2010] (http://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-180002.4) en lugar del informe haskell98 en estos días (aunque en este caso dicen lo mismo , por lo que puedo ver). –

Cuestiones relacionadas