Al escribir el REPL tengo la sensación de que un lenguaje estricto no funciona tan bien con la acción monádica una vez que se encadenan algunas acciones. Agregar una mejor sintaxis para las acciones monádicas tal vez podría hacerlo lo suficientemente conveniente, pero como el lenguaje no es puro de todos modos, es probable que sea mejor eliminar la mónada IO por ahora.
En lugar de eliminar la mónada IO, puede valer la pena agregar algo de azúcar de sintaxis para facilitar la escritura de acciones monádicas.
let test = 123
do let x = Some a
do None
None
do <expr> in <expr_2>
// Indentation works instead of in
do <expr>
<expr_2>
==>
<expr> >>= (\_ -> <expr_2>)
do let x = <expr> in <expr_2>
// Indentation works instead of in
do let x = <expr>
<expr_2>
==>
<expr> >>= (\x -> <expr_2>)
let opt =
do let x = get map "abc"
return x
match opt with
| Some y -> y
| None -> error "Expected Some"
Una idea para hacer esto más fácil en la respuesta podría ser tener un comando :x <expr>
para ejecutar acciones IO, como en la respuesta de Idris.
Imo, me equivocaría por mantener la fealdad por ahora, y descubriría cómo hacerla más bonita más tarde.
La respuesta ya ejecuta acciones IO directamente. Sin embargo, agregar :x <expr>
puede hacerlo más explícito. Simplemente imité ghci, que también ejecuta acciones IO de inmediato.
Comentario más útil
En lugar de eliminar la mónada IO, puede valer la pena agregar algo de azúcar de sintaxis para facilitar la escritura de acciones monádicas.