Soy nuevo en Haskell y en la codificación en general y estoy teniendo un pequeño problema.
sti :: [Char] -> [Integer]
sti "" = [fromIntegral (ord x)| x<-""]
Entonces, lo que estoy tratando de hacer con lo anterior es crear una lista de enteros a partir de una cadena, por ejemplo "Hello"
se convierte ["H","e","l","l","o"]
y luego convierto esa lista en sus respectivos valores ord de Data.Char
.
Mi problema es que cuando intento usar esta función, obtengo: Patrones no exhaustivos en función sti
. ¿Esto significa que hay casos en los que no puedo tomar el orden x de una cadena? Y si es así, ¿cómo podría solucionarlo?
Cualquier ayuda sería apreciada.
Respuestas
2 para la respuesta № 1Usted está manejando solamente el caso de la cadena vacía, ""
. Tu quieres esto:
sti :: [Char] -> [Integer]
sti xs = [fromIntegral (ord x) | x <- xs]
xs
es una variable y coincidirá con cualquier cosa, que es lo que desea en este caso.
Tenga en cuenta que puede usar la coincidencia de patrones para implementar casos especiales, por ejemplo:
sti :: [Char] -> [Integer]
sti "" = [1,2,3]
sti xs = [fromIntegral (ord x) | x <- xs]
Esta función devuelve los valores de caracteres ASCII de los caracteres en la cadena de entrada, excepto cuando la entrada es la cadena vacía, en cuyo caso devuelve [1,2,3]
en lugar. Esta puede ser una característica útil incluso si no es lo que quieres aquí.
Si tu solamente implementar casos especiales, y dejar casos para los que no haya definido ningún valor para su función, se bloqueará si intenta evaluar su función para esos casos:
Prelude Data.Char> let sti "" = [fromIntegral (ord x) | x <- ""]
Prelude Data.Char> sti "foo"
*** Exception: <interactive>:9:5-45: Non-exhaustive patterns in function sti
1 para la respuesta № 2
Usted está usando ""
Como si fuera un nombre de variable. Pero en Haskell, significa cuerda vacía en lugar. Por lo tanto, su función solo se define para cadenas vacías y le dará el error de patrón no exhaustivo en todos los demás casos.
Debe reemplazar eso con un nombre de variable adecuado.