[Esta pregunta está motivada por el capítulo 9 en "Real World Haskell"]
He aquí una función simple (corte a lo esencial):
saferOpenFile path = handle (\_ -> return Nothing) $ do
h <- openFile path ReadMode
return (Just h)
¿Por qué necesito que $
?
Si el segundo argumento para manejar no es un bloque do, no lo necesito. Los siguientes funciona bien:
handle (\_ -> putStrLn "Error calculating result") (print x)
Cuando traté de quitar la compilación $
fracasaron. Puedo conseguir que funcione de forma explícita si añado parens, es decir
saferOpenFile path = handle (\_ -> return Nothing) (do
h <- openFile path ReadMode
return (Just h))
puedo entender que, pero supongo que estoy esperando que cuando Haskell golpea el do
se debe pensar "estoy empezando un bloque", y no deberíamos tener que poner explícitamente el $
allí para romper las cosas.
También pensé que empuja el bloque do a la siguiente línea, así:
saferOpenFile path = handle (\_ -> return Nothing)
do
h <- openFile path ReadMode
return (Just h)
pero eso no funciona sin parens tampoco. Eso me confunde, porque las siguientes obras:
add a b = a + b
addSeven b = add 7
b
estoy seguro de que voy a llegar al punto donde lo acepto como "eso es sólo la forma de escribir idiomática Haskell", pero ¿alguien tiene alguna perspectiva para dar ? Gracias por adelantado.
Disculpa, amigos, no sé stackoverflow muy bien. El código es solo basura. (¿Por qué no hay una "Pregunta de vista previa"). Intentaré volver a publicarlo. – Jonathan
simplemente presione el botón "código" en la barra de herramientas del editor (parece un par de llaves). Además, la vista previa está justo debajo de donde escribe, actualizada en tiempo real ... – Jon
¡Ah, NoScript necesitaba permitir un dominio más! Se ve bien ahora. Gracias, Jon! – Jonathan