/ / Patrones no exhaustivos en la función: convertir una cadena en una lista de valores ord - haskell, converter

Patrones no exhaustivos en la función: convertir una cadena en una lista de valores ord: haskell, converter

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 № 1

Usted 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.