¿Por qué recibo “patrones no exhaustivos en la función ...” cuando invoco mi Haskell subcadena función?

StackOverflow https://stackoverflow.com/questions/3799359

  •  05-10-2019
  •  | 
  •  

Pregunta

Estoy trabajando mi camino a través del libro El Haskell Camino a la Lógica, Matemáticas y Programación . (Sólo estoy a medio camino en el capítulo 1, pero lo estoy disfrutando hasta el momento y la intención de continuar.) He leído a través de la sección 1.5 "Jugando el juego Haskell", que "consiste en una serie de ejemplos adicionales a que se familiarice con [Haskell]". Hasta ahora he aprendido acerca de las funciones, declaraciones de tipo, ecuaciones vigilado, un poco acerca de la lista de coincidencia de patrones, y donde y dejar.

Estoy atascado en el ejercicio 1.17, lo que nos pide que escriba una subcadena función :: String -> String -> Bool donde:

  1. si xs es un prefijo de ys, xs es una subcadena de ys
  2. si ys es igual a y: ys' y xs es una subcadena de ys', xs es una subcadena de ys
  3. otra cosa es una subcadena de ys

I utiliza la función de prefijo proporcionado en un ejemplo anterior:

prefix :: String -> String -> Bool
prefix [] ys = True
prefix (x:xs) [] = False
prefix (x:xs) (y:ys) = (x==y) && prefix xs ys

Y luego trató:

substring :: String -> String -> Bool
subsstring xs [] = False
substring xs (y:ys) | prefix xs (y:ys) = True
                    | substring xs ys  = True
                    | otherwise        = False

... y que otras permutaciones de esto.

Cuando corro substring "abc" "xxxabcyyy" consigo True, pero cuando corro substring "abc" "xxxabyyy" consigo "*** Excepción: substring.hs: (3,0) - (5,45): patrones no exhaustivos en función de subcadena". No puedo entender por qué. No entiendo cómo puede haber patrones no exhaustivos cuando uso "de otro modo".

Por cierto, el libro aún no ha cubierto if-then-else. Yo prefiero mantener eso de la solución, por ahora.

¿Fue útil?

Solución

Hay un error tipográfico en el nombre de la función:

subsstring xs [] = False

Debido a la errata esta declara un nuevo subsstring función, no es un caso de la función substring.

La función substring sí entonces no tiene caso que se correspondería con un segundo parámetro de [].

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top