2015-07-22 8 views
1

En ghci ce code:modèles non-exhaustive en fonction max

let max [] = error "maximum of empty list" 

let max [x] = x 

let max (x:xs) 
    | x > maxTail = x 
    | otherwise = maxTail 
    where maxTail = max xs 

provoque une erreur: *** Exception: <interactive>:26:5-106: Non-exhaustive patterns in function max

Quel est le modèle non-épuisable ici? Les listes elem zéro, elem unique et multi elem sont-elles prises en compte?

Update: enter image description here

Update 2:

enter image description here

Update 3:

fonctionne comme prévu sur Debian (Raspberry Pi):

enter image description here

+0

Il n'y a pas de ': {' et ':}' dans votre capture d'écran. – sepp2k

+0

Cela semble correct maintenant. Je suis un peu confus pourquoi il n'a pas inséré "Prelude |" avant chaque ligne cependant. Peut-être qu'il y a une étrange interaction entre WinGHCi et le mode multi-lignes et/ou le collage. – sepp2k

+0

J'utilise WinGHCi mais je n'ai jamais été capable d'y coller plusieurs lignes pour travailler. –

Répondre

8

En utilisant trois let séparés s, vous définissez trois fonctions distinctes, non exhaustives, nommés max chacun shadowing précédent ceux Pour définir une fonction multi-cas à l'aide let, vous utilisez les let les mots clés, puis il suffit de répéter la signature de la fonction à la même indentation pour chaque motif comme celui-ci:

let max [] = error "maximum of empty list" 
    max [x] = x 
    max (x:xs) 
     | x > maxTail = x 
     | otherwise = maxTail 
     where maxTail = max xs 

Pour que cela (ou tout autre morceau de code qui prend plusieurs lignes) pour fonctionner dans GHCI, vous devez démarrer le mode multi-ligne en entrant :{ et ensuite le quitter ensuite avec :} ou écrire tout en une ligne en utilisant ; au lieu des sauts de ligne (sauf avant | où vous écririez simplement | sans ; ou un saut de ligne devant).

+1

Vous pouvez également écrire ceci sur une ligne en délimitant les définitions avec un ';'. – AJFarmar

+0

@ sepp2k essayé votre code, y compris entrer en mode multi ligne, mais recevoir une erreur: ": 74: 56: erreur d'analyse sur l'entrée '='" –

+0

@AJFarmar Bon point, j'ai modifié ma réponse. – sepp2k

1

GHCi (et en général, let) ne vous permet pas de définir une fonction de cette façon. Vous avez simplement défini 3 fonctions, en les écrasant l'une par l'autre à chaque fois.

Si vous souhaitez continuer à utiliser GHCi, écrire quelque chose comme ceci:

let max list = case list of 
    [] -> error "maximum of empty list" 
    [x] -> x 
    (x:xs) -> 
     if x > maxTail then x else maxTail 
     where maxTail = max xs 
+2

'let' * does * vous permet de définir une fonction avec plusieurs motifs, il suffit d'écrire' let' qu'une seule fois. Mais plus important encore, GHCi ne vous permet pas d'écrire du code qui occupe plusieurs lignes à moins que vous n'utilisiez ': {' et ':}'. Donc, votre suggestion ne fonctionnera pas sans cela non plus. – sepp2k