Ok, estoy tratando de entender a IO en Haskell, y pensé que escribiría una pequeña aplicación corta que tratara con páginas web para hacerlo. El fragmento Me voy a tropezar en IS (con perdón de bobince, aunque para ser justos, no estoy tratando de análisis sintáctico HTML aquí, sólo extraer uno o dos valores):Ayuda de Haskell Curl
titleFromUrl url = do
(_, page) <- curlGetString url [CurlTimeout 60]
matchRegex (mkRegexWithOpts "<title>(.*?)</title>" False True) page
la anterior debe tomar una URL en forma de cadena, escanear la página a la que apunta con matchRegex
y devolver Nothing
o Just [a]
, donde a
es la cadena coincidente (posiblemente multilínea). Lo frustrante es que cuando intento hacer
Prelude> (_, page) <- curlGetString url [CurlTimeout 60]
Prelude> matchRegex (mkRegexWithOpts "<title>(.*?)</title>" False True) page
en el intérprete, hace exactamente lo que yo quiero. Cuando trato de cargar la misma expresión, y el imports
asociado de un archivo, me da un error de inferencia de tipo que lo indica couldn't match expected type 'IO b' against inferred type 'Maybe [String]'
. Esto me dice que me estoy perdiendo algo pequeño y fundamental, pero no puedo entender qué. He intentado convertir explícitamente page
en una cadena, pero eso es solo programación por superstición (y no funcionó en ningún caso).
¿Alguna pista?
Funciona, pero solo como seguimiento; ¿Entiendo correctamente que esto básicamente significa que no puedo devolver una cadena regular de una función que realiza IO?que más bien necesita ser 'IO String' (o, como en el caso anterior' IO (Maybe [String]) '? ¿Qué pasa si quiero hacer algo como concatenar el valor de retorno de' titleFromUrl' con otra cadena, o imprimir sin el 'Just [~ a]' envolviéndolo? Lo siento si esta es una pregunta estúpida, soy algo nuevo en lo de la mecanografía fuerte. – Inaimathi
Está bien, solo necesitas enlazar. Si tienes un valor ' m' del tipo 'IO a', luego puede escribir' do {x <- m; stuff} ', y' x' tendrá el tipo 'a', para lo cual puede hacer lo que quiera. La única restricción es que 'stuff' tiene que ser una especie de valor' IO', que puede ser una llamada de valor o función, o puede ser más enlaces '<-'. Así que puedes hacer cualquier cosa con' String' en el interior, siempre y cuando eventualmente devuelve un 'IO' algo. Sugiero leer un tutorial de mónada Hay toneladas, aquí hay dos: http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and. html o LYAH capítulo 11 y 12. – luqui
[facepalm] Ok, creo ** que enlace ayudado. Me estaba equivocando al olvidar que no se puede garantizar el orden de ejecución en un lenguaje perezoso y puramente funcional. La modificación del fragmento solo le dice al compilador que fuerce el resultado de 'matchRegex' antes de usarlo en cualquier lugar. ¿Estoy cerca? – Inaimathi