2010-09-26 21 views
10

Estoy trabajando en el libro The Haskell Road to Logic, Maths and Programming. (Estoy solo a la mitad del capítulo 1, pero lo estoy disfrutando hasta el momento y tengo la intención de continuar.) He leído la sección 1.5 "Jugar al juego Haskell", que "consiste en una serie de ejemplos adicionales para familiarízate con [Haskell] ". Hasta ahora he aprendido sobre funciones, declaraciones de tipo, ecuaciones protegidas, un poco sobre la coincidencia de patrones de lista y dónde &.¿Por qué obtengo "patrones no exhaustivos en la función ..." cuando invoco mi función de subcadena Haskell?

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

  1. si x 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

he utilizado la función de prefijo proporcionado en una 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" me sale True, pero cuando corro substring "abc" "xxxabyyy" me sale " * 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 podría haber patrones no exhaustivos cuando utilizo "de lo contrario".

Por cierto, el libro aún no ha cubierto if-then-else. Preferiría mantener eso fuera de mi solución, por ahora.

Respuesta

12

Usted tiene una errata en el nombre de la función:

subsstring xs [] = False 

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

La función substring no tiene ningún caso que coincida con un segundo parámetro de [].

+4

No puedo decidir si me da vergüenza que haya perdido el tiempo con un error tipográfico o que me haya complacido que mi solución haya funcionado a excepción del error tipográfico. Gracias. –

+2

Esto es interesante. Puede tener uno de los sistemas de tipo más sofisticados, un error tipográfico no puede atraparlo. – gawi

+2

para eso están las advertencias. – muhmuhten

Cuestiones relacionadas