2011-12-28 3 views
15

Estaba buscando la definición de seq y encontré esta rareza. ¿Por qué todas estas funciones tienen las mismas/similares definiciones?Pasando por el código fuente del preludio, aparece la rareza

seq :: a -> b -> b 
seq = let x = x in x 

inline :: a -> a 
inline = let x = x in x  

lazy :: a -> a 
lazy = let x = x in x 

Hay muchos más con esta definición en el código fuente. ¿Que esta pasando?

Respuesta

21

Lo que está pasando es que estas funciones no se pueden implementar en Haskell, pero deberían aparecer en los documentos. Como haddock necesita una definición sintácticamente correcta (y bien tipada) para cada firma, la fuente debe contener definiciones ficticias. Además, en el punto donde están definidos (en el paquete ghc-prim), error (y por lo tanto undefined) aún no están disponibles, por lo que no se puede usar el seq = error "Not implementable in Haskell" más obvio, por lo tanto, la definición circular.

+1

¿Hay alguna razón por la que 'error' * no * se pueda definir antes que' seq' y amigos? –

+3

'error' se define como' throw (ErrorCall message) ', por lo que necesita el mecanismo' Exception' y 'Typeable'. Podría definirse fuera del marco 'Exception', usando directamente la primitiva 'raise #', hasta donde yo sé, pero es mejor que encaje con los otros 'Exception's. Entonces, para mantener 'ghc-prim' pequeño, que solo proporciona' raise # ', el material más elaborado entra en' base'. En resumen, podría definirse antes, pero no es tan bueno, y no hay una buena razón para hacerlo, la fuente 'GHC.Prim' sería un maniquí sin usar de todos modos. –

9

Estas definiciones son un ardid: las proporciona primitivamente el tiempo de ejecución de GHC. Resulta que el bucle infinito let x = x in x se puede asignar a cualquier tipo, por lo que es una definición tan buena como cualquiera.

Cuestiones relacionadas