2010-11-18 6 views
5

Estaba leyendo LYAH. Se dice que tengo que cargar explícitamente Control.Monad.Instances para obtener la sintaxis siguiente para trabajar:¿Por qué no se implementa (->) con Control.Monad.Instances de forma predeterminada

((fmap (+5)) (+5)) 4 

¿Por qué? ¿Por qué si los funtores son esta tecnología subyacente y unificadora tengo que cargar explícitamente Control.Monad.Instances para obtener esa funcionalidad? ¿Cómo se implementa (->) sin él (o simplemente está oculto y solo se exportó ->)? ¿Por qué no se usa el uso de fmap en los tipos de funciones de forma predeterminada?

+0

Véase también http://stackoverflow.com/questions/4204086/is-the-monad-w-instance-anywhere-standard –

Respuesta

10

Aquí hay 3 conceptos diferentes involucrados. El tipo de función, la clase de tipo Functor y la "instancia" Functor. El tipo de función, (->), está integrado en el lenguaje y su existencia e implementación no están relacionadas con Functor y fmap. La clase de tipo es la especificación de la firma de sus métodos asociados. La "instancia" es una implementación de esa firma.

Para aclarar su pregunta, la volvería a formular como "¿por qué no se proporciona la instancia de Functor para (->) en el Preludio?" (el Preludio es el módulo que está en el alcance por defecto). Tal como está redactado actualmente, no tiene mucho sentido.

La respuesta a la pregunta modificada es simple: el informe Haskell (la especificación del idioma oficial, que es donde se especifica la interfaz del Prelude) no lo incluye. Podría decirse que debería, pero el lenguaje Haskell y las bibliotecas han evolucionado mucho desde entonces, y los estándares de Haskell tienden a cambiar lentamente. En cualquier caso, correcto o incorrecto, es por eso.

2

Functor no es una función de idioma, es solo una clase de tipo útil que un módulo aleatorio puede definir. Para usar la definición de Functor de ese módulo, debe cargarlo, fin de la historia.

Cuestiones relacionadas