Mejor excepción para patrones no exhaustivos en el caso

¿Hay alguna manera de hacer que GHCi produzca mejores mensajes de excepción cuando encuentra en el tiempo de ejecución que una llamada ha producido un valor que no coincide con la coincidencia de patrones de la función?

Actualmente da los números de línea de la función que produjo la coincidencia de patrón no exhaustiva que, aunque útil a veces, requiere una ronda de depuración que a veces siento que está haciendo el mismo conjunto de cosas una y otra vez. Entonces, antes de tratar de armar una solución, quería ver si algo más existe.

¿Un mensaje de excepción que además de dar los números de línea muestra qué tipo de llamada intentó realizar?

¿Esto es posible?

Intenta activar las advertencias en ghci. Esto habilita las advertencias de tiempo de comstackción que puede obtener con ghc pasando -W , por ejemplo. Puedes hacer esto de varias maneras:

 ghci -fwarn-incomplete-patterns 

O Neil Mitchell describe cómo él establece esto en su .ghci . Aquí está el extracto relevante:

 :set -fwarn-incomplete-patterns 

También puede ingresar esto manualmente en ghci, pero sería difícil hacerlo cada vez que lo inicie. Introducido de esta manera, solo funciona para las declaraciones ingresadas en el prompt, no para cargar archivos con :l . En su lugar, puede poner este comentario en la parte superior del archivo que desea advertir sobre patrones incompletos:

 {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} 

Reconozco que esto es algo así como una respuesta a su pregunta, pero mi impresión es que entre los veteranos progtwigdores de Haskell hay un consenso general de que los patrones no exhaustivos deben evitarse en primer lugar, incluso hasta el punto de utilizar -Werror para generar errores en lugar de solo advertencias.

No estoy seguro de qué tan bien funcione en combinación con GHCi, sin embargo, especialmente si está escribiendo funciones en el prompt en lugar de cargar un archivo, puedo imaginar que interfiere más de lo que ayuda a trabajar de forma interactiva. Sin embargo, ejecutar GHCi con los indicadores de línea de comando apropiados parece obtener el resultado deseado para mí.

Si desea una solución más drástica para los patrones no exhaustivos, siempre puede hacer que Catch funcione con las versiones modernas de GHC. Je.

Más allá de eso, si está utilizando patrones no exhaustivos porque la función realmente, realmente, nunca debería llamarse con algunos valores, los casos faltantes pueden completarse con algo como error $ "function foo called with ridiculous arguments " ++ show blahBlah , si conocer los argumentos inválidos sería útil. Alternativamente, podría intentar volver a trabajar su código o definir tipos de datos más especializados para que las funciones siempre puedan hacer algo sensato con cualquier argumento que no sea de fondo.

De lo contrario, creo que estás atascado con una depuración incómoda.