Perché mi appare “modelli non esaustivi in ??funzione ...” quando invoco il mio Haskell sottostringa funzione?

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

  •  05-10-2019
  •  | 
  •  

Domanda

sto lavorando la mia strada attraverso il libro La Haskell Road to logica, matematica e programmazione . (Io sono solo a metà strada attraverso il capitolo 1, ma mi sto divertendo così lontano ed ho intenzione di continuare.) Ho letto attraverso la sezione 1.5 "Playing the Haskell Game", che "è costituito da una serie di ulteriori esempi per porterà a conoscenza di [Haskell]". Finora ho imparato a conoscere le funzioni, tipo le dichiarazioni, equazioni custoditi, un po 'di lista il pattern matching, e dove e lasciare.

Sono bloccato su esercizio 1,17, che ci chiede di scrivere una funzione stringa :: String -> String -> Bool dove:

  1. se xs è un prefisso di Ys, xs è una sottostringa di YS
  2. se ys è uguale a y: ys' e XS è una stringa di Ys', XS è una stringa di YS
  3. non altro è una sottostringa di YS

ho usato la funzione prefisso fornite in un esempio precedente:

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

E poi provato:

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

... e può altre permutazioni di questo.

Quando eseguo substring "abc" "xxxabcyyy" ottengo True, ma quando corro substring "abc" "xxxabyyy" ottengo "*** eccezione: substring.hs: (3,0) - (5,45): i modelli, non limitativi, in funzione di stringa". Non riesco a capire perché. Io non capisco come ci potrebbe essere modelli non esaustivi quando uso "altrimenti".

A proposito, il libro non è ancora coperta if-then-else. Preferirei tenere che, su mia soluzione, per ora.

È stato utile?

Soluzione

Si dispone di un errore di battitura nel nome della funzione:

subsstring xs [] = False

A causa della errore di battitura questo dichiara una nuova funzione subsstring, non un caso della funzione substring.

La funzione substring stesso, allora non ha comunque che corrisponda un secondo parametro di [].

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top