¿Se recomienda siempre tener coincidencias de patrones exhaustivas en Haskell, incluso para casos "imposibles"?¿Se recomienda siempre tener coincidencias de patrones exhaustivas en Haskell, incluso para casos "imposibles"?
Por ejemplo, en el siguiente código, estoy coincidiendo con el patrón en el "acumulador" de un foldr. Estoy en control total de los contenidos del acumulador, porque lo creo (no me lo pasa como entrada, sino que se construye dentro de mi función). Por lo tanto, sé que ciertos patrones nunca deberían coincidir. Si me esfuerzo por no obtener nunca el error "Patrón coincidente no es exhaustivo", entonces colocaría una coincidencia de patrón para él, simplemente error con el mensaje "Este patrón nunca debería ocurrir". Muy parecido a una afirmación en C#. No puedo pensar en otra cosa que hacer allí.
¿Qué práctica recomendaría en esta situación y por qué?
Aquí está el código:
gb_groupBy p input = foldr step [] input
where
step item acc = case acc of
[] -> [[item]]
((x:xs):ys) -> if p x item
then (item:x:xs):ys
else [item]:acc
El patrón no coincide (según lo informado por el intérprete) es:
Advertencia: Coincidencia de patrón (es) no son exhaustivas En una alternativa caso: Patrones no coincide: []: _
Lo molesto aquí es que para silenciar la advertencia a menudo termina poniendo un mensaje de error de tiempo de ejecución menos útil. Me gustaría simplemente reconocer el caso perdido pero permitir el uso del texto de error de tiempo de ejecución predeterminado (que apunta al número de archivo/línea). –
Ese es un gran punto. Supongo que actualmente no hay forma de hacer eso. Demasiado. –
ver también http://stackoverflow.com/questions/1882334 – sdcvvc