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?
¿Hay alguna razón por la que 'error' * no * se pueda definir antes que' seq' y amigos? –
'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. –