Este es un seguimiento de Why am I getting "Non-exhaustive patterns in function..." when I invoke my Haskell substring function?En Haskell, ¿por qué los patrones no exhaustivos no son errores en tiempo de compilación?
entiendo que el uso de -Wall
, GHC puede advertir en contra de los patrones no exhaustivos. Me pregunto ¿cuál es la razón detrás no por lo que es un error en tiempo de compilación por defecto dado que siempre es posible definir explícitamente una función parcial:
f :: [a] -> [b] -> Int
f [] _ = error "undefined for empty array"
f _ [] = error "undefined for empty array"
f (_:xs) (_:ys) = length xs + length ys
La cuestión no es GHC-específica.
¿Es porque ...
- nadie quería hacer cumplir un compilador de Haskell para llevar a cabo este tipo de análisis?
- una búsqueda de patrón no exhaustivo puede encontrar algunos, pero no todos los casos?
- funciones parcialmente definidas se consideran legítimas y se utilizan con la suficiente frecuencia como para no imponer el tipo de constructo que se muestra arriba? Si este es el caso, ¿puede explicarme por qué los patrones no exhaustivos son útiles/legítimos?
Otro caso algo común sería declaraciones lambda dentro de una rama de guard/case/if. Usted sabe que el argumento tiene cierta forma debido a la rama en la que se encuentra, por lo que incluirla en el lambda es innecesario. –
No creo que deba escribirse de otra manera. Es una gran definición de mod2 incluso si el compilador cree que no es exigente. Llegué a esta pregunta porque recibí este error escribiendo una función fib que no debería definirse para enteros negativos. –
quizás esto esté fuera de alcance, pero ¿está decidiendo si una coincidencia de patrón es exhaustiva o no está relacionada con el problema de detención? intuitivamente, parece que un lenguaje tan estrictamente tipeado como haskell debería permitir este tipo de análisis, al menos para subconjuntos del lenguaje, pero sé que los instintos intestinales suelen ser una forma horrible de adivinar si algo es o no computable. – kai