2011-03-17 16 views
7

Estoy tratando de atrapar excepciones debido a la acción ([1,2] !! 3). No puedo.Haskell. Non IO Exception handling

yo estaba tratando

let a = [1,2] 
  • handle (\(e :: SomeException) -> print "err" >> return 1) (return $ a !! 3)
  • Control.Exception.catch (return $ a !! 3) (\(e::SomeException) -> print "err" >> return 1)

en tanto que consigo Excepción: Preludio (!!):. Índice demasiado grande *

¿Es posible? Probablemente debo usar el enfoque Maybe.

Gracias por la ayuda.

Respuesta

7

La pereza y las excepciones, como la pereza y el paralelismo, ¡interactúan de maneras sutiles!

El return cierra el acceso a la matriz en un procesador de segundo plano, por lo que se devuelve sin evaluar, haciendo que la excepción se evalúe fuera del controlador.

La solución es garantizar que la evaluación de return también debe evaluar el índice de la lista. Esto se puede hacer a través de $! en este caso: - (! $ Retorno a !! 3)

mango ((E :: SomeException)> print "err" >> retorno 1)

+0

" la evaluación de 'retorno' también debe evaluar el índice de la lista "- esta es una buena frase para pensar sobre el rigor. +1 – luqui

+0

a veces me olvido de la holgazanería de Haskell – Anton

4

Esto generalmente significa que su código es demasiado flojo y la desreferencia ocurre después de que el manejador regrese. Intente usar $! en lugar de $ para forzar la evaluación.