2012-08-10 750 views
7

Es trivial para redefinir la función¿Cómo se define (?) Internamente?

(,) :: a -> b -> (a,b) 
(,) a b = (a,b) 

El (para mí) Lo extraño es que esta función se define para tuplas de longitud arbitraria. Entonces, por ejemplo, en realidad hay una función:

(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) :: a -> b -> c -> ... -> (a,b,c,...) 

¿Cómo se hace esto? ¿Por qué no se hace para todas las funciones estándar en tuplas, como zip?

Hoogle me da no results, y no veo cómo la plantilla Haskell podría hacer esto, así que supongo que debe ser algún tipo de magia dentro del compilador. Pero eso me parece muy poco Haskelly.

+1

Debería tener su pregunta ahora. –

+1

Muy no Haskelly, pero cierto. – augustss

Respuesta

6

¿Cómo se hace esto?

Compatibilidad con el compilador. El informe del lenguaje Haskell exige (,) para ser soportado por al menos hasta 15 argumentos (6.1.4), pero GHC va un poco más lejos y los genera para mucho más (la última vez que probamos esto, podría manejar cientos o incluso miles)) zip y otras funciones de tupla deben definirse para hasta 7 tuplas. No sé si GHC genera ésos para cantidades más grandes.

+1

"cientos o incluso miles" <- ¿en serio? GHC 7.4.1 informa que 'una tupla 63 es demasiado grande para GHC (el tamaño máximo es 62) Solución: use tuplas anidadas o defina un tipo de datos' cuando lo intente. –

+0

¿Por qué 62? 64 (2^6) tendría mucho más sentido. ¿Alguien sabe a qué van los 2 extra? –

+2

Typechecker tiene tiempo exponencial en algunas configuraciones. Debido a que algunas clases no están definidas para tuplas largas, ver código fuente para GHC.Tuple de ghc-prim. – permeakra

2

Tengo entendido que (,) no es una función normal, es un constructor con sintaxis especial, cableada en el idioma. Es similar a la sintaxis [1, 2, 3], que no puedes definir tú mismo porque está cableado.

2

Se especifica en la definición de idioma y está cableado en el compilador. No defines tuplas en Haskell. La definición de Haskell incluye tuplas.

Se acepta la sintaxis (,,,) para tuplas, que son tipos de productos anónimos, que son bastante fundamentales. Estos también funcionan perfectamente bien con la inferencia de tipos, ya que cada componente está presente y se puede inferir.

No existe una sintaxis aceptada para los tipos de suma anónima, y ​​es posible que no funcionen bien con la inferencia de tipo.

Haskell ofrece sintaxis de infijo definible por el usuario pero no paréntesis definidos por el usuario (fuera de las amplias posibilidades de cuasi cita).