2009-05-16 8 views
0

Im nouveau à Haskell !! J'ai écrit ce code:syntaxe dans l'expression - Haskell

import Data.List 
inputIndex :: [String] -> [String] -> Bool 
inputIndex listx input = and [x `elem` listx |x <- input] 
inputIndex = if inputIndex == true 
       then putStrLn ("ok") 

Il fonctionne très bien sans la déclaration if mais quand je mets la déclaration if l'erreur suivante apparaît:

Erreur de syntaxe dans l'expression (inattendue `} », peut-être en raison d'une mauvaise mise en page)

Qu'est-ce que je fais mal ici?

Merci

+2

Où est "ce code" que vous avez écrit? – ShreevatsaR

+0

Vous allez devoir formater ce code un peu mieux pour que nous puissions le lire correctement. –

Répondre

8

Quelques choses sont mal ici:

  • Vous aurez besoin une clause else.
  • True doit être en majuscule.
  • inputIndex doit toujours prendre deux arguments (ce n'est pas le cas dans le dernier cas).

Je suppose que vous voulez quelque chose comme ça ...

inputIndex :: [String] -> [String] -> IO() 
inputIndex listx input = if inputIndex' listx input 
          then putStrLn ("ok") 
          else putStrLn ("not ok") 
    where 
    inputIndex' :: [String] -> [String] -> Bool 
    inputIndex' listx input = and [x `elem` listx |x <- input] 

(Ici je définissais une nouvelle fonction avec un nom quasi-identique, en ajoutant un premier/apostrophe. En définissant dans le where clause, elle n'est visible que par la fonction externe inputIndex Vous pouvez appeler cela une fonction d'aide, si vous voulez, j'aurais pu aussi choisir un nom complètement différent, mais je ne suis pas créatif.)

Vous pourriez aussi condenser ceci à la suivante (qui est aussi plus générale):

allPresent :: (Eq t) => [t] -> [t] -> IO() 
allPresent xs ys = putStrLn (if and [y `elem` xs | y <- ys] then "ok" else "not ok") 
+0

merci! cela a fonctionné comme prévu. pourriez-vous me dire la signification de la virgule devant inputIndex. – pier

+0

cela a fonctionné même sans la 1ère ligne inputIndex :: [String] -> [String] -> IO() – pier

+0

@dlna: la virgule est une apostrophe. J'ai mis à jour ma réponse avec quelques explications. La première ligne est en effet inutile. Sans elle, la fonction fonctionne pour chaque paire de listes du même type (car Haskell déduit alors le type le plus général possible.) – Stephan202

0
  1. Il est "vrai", pas "vrai".
  2. Votre deuxième implémentation inputIndex n'est pas compatible avec la première. Tous vos cas de modèle pour une fonction doivent avoir la même signature ([String] -> [String] -> Bool)
  3. L'erreur que vous affichez ici n'est pas générée par ce code, car il n'y a pas de '}' ici.
  4. putStrLn a la signature String -> IO() alors que votre inputIndex a l'air d'être pur - il suffit de retourner la valeur et de l'imprimer ailleurs.