2011-08-11 20 views
9

¿Es posible interactuar de forma incremental con instancias de Monad arbitrarias en el indicador de GHCi?Mónadas en el prompt?

Puede introducir "hacer" órdenes interactivamente:

Prelude> x <- return 5 

Pero por lo que yo puedo decir, todo lo que es forzado en la IO() Mónada. ¿Qué sucede si quiero interactuar con una mónada arbitraria en su lugar?

¿Estoy obligado a escribir toda la secuencia de comandos dentro de un do { ... } gigante y/o utilizar los operadores de infijo directamente? Está bien, pero preferiría "ingresar" una mónada arbitraria e interactuar con ella una línea a la vez.

¿Posible?

+1

Ver el ticket de ghc trac http://hackage.haskell.org/trac/ghc/ticket/4316 – vivian

Respuesta

4

Claro que puedes. Simplemente anota tu tipo.
p. para la Maybe Monad:

let x = return 5 :: Maybe Int 

dará lugar a

Just 5 

O tomar la lista mónada:

let x = return 5 :: [Int] 

dará lugar a

[5] 

Por supuesto también se puede jugar alrededor de la mónada:

let x = return 5 :: Maybe Int 
x >>= return . (succ . succ) 

que se traducirá en Just 7

+2

No creo que sea eso lo que OP está pidiendo; tal como lo leí, él quiere que el tipo de sesión interactiva sea Monad m => m a en lugar de IO a, no solo 'hacer cosas' con mónadas. – valderman

+0

@valdermann: tienes razón ... sin embargo esto me pareció muy útil muchas veces y en una sesión de ghci activa esta es la única forma (que yo sepa) de "interactuar con una mónada arbitraria" – oliver

+1

@oliver Nope, no era exactamente lo que estaba buscando, pero como lo que estaba buscando no es posible, creo que esta es la respuesta. Escribir {it >> =} como un prefijo en cada línea da la sensación incremental que quiero, a expensas de unas pocas teclas. ¡Gracias! – tangentstorm

11

Tal como están las cosas, el comportamiento específico de IO se basa en la forma en IO acciones son un poco statelike y inhabilitar la función retráctil. Por lo tanto se puede decir cosas como

s <- readFile "foo.txt" 

y obtener un valor real s :: String.

Está bastante claro que se necesita mucho más que la estructura Monad para mantener ese tipo de interacción. No sería tan fácil con

n <- [1, 2, 3] 

decir lo valor tiene n.

Uno ciertamente podría imaginarse la adaptación de ghci para abrir un prompt que permita construir un cómputo monádico do -style en múltiples interacciones de línea de comandos, entregando el cómputo completo cuando el prompt está cerrado. No está claro qué significa inspeccionar los valores intermedios (aparte de generar colecciones de cálculos de impresión del tipo m (IO()), para la mónada activa m, por supuesto).

Pero sería interesante preguntar si lo especial acerca de IO que hace posible un buen comportamiento de un aviso interactivo puede ser aislado y generalizado. No puedo evitar olfatear una historia comonádica de valor en contexto sobre la interacción en un aviso, pero aún no lo he rastreado.Uno podría imaginar dirigirse a mi ejemplo de lista considerando lo que significa tener un cursor en un espacio de valores posibles, de la forma en que IO tiene un cursor impuesto por el aquí y ahora del mundo real. Gracias por la comida para pensar.

+0

Veo tu punto. Son un poco genéricos. Estaba específicamente queriendo usarlo para una mónada de estado, aunque el concepto de cursor también es bastante intrigante. – tangentstorm