2016-03-06 2 views
0

J'ai besoin d'analyser un type (String,Int) comme userRatings est afin de lire à partir d'un textFile correctement et j'utilise Parsec. C'est l'analyse avec l'importation, ma fonction tuple stringInt a cette erreur.Analyse d'un Tuple (String, Int) dans Haskell

Attendons deux arguments 'parsec (String, Int)' prévu un type, mais 'parsec (String, Int)' a en quelque sorte '* -> * -> *' Dans la signature de type pour 'stringIntTuple': stringIntTuple :: parsec (String, Int)

import Control.Monad 
    import Control.Applicative((<*)) 
    import Text.Parsec 
     (Parsec, ParseError, parse  -- Types and parser 
     , between, noneOf, sepBy, many1 -- Combinators 
     , char, spaces, digit, newline  -- Simple parsers 
     ) 
    -- Types 
    type Title = String 
    type Director = String 
    type Year = Int 
    type UserRatings = (String,Int) 
    type Film = (Title, Director, Year , [UserRatings]) 
    type Period = (Year, Year) 
    type Database = [Film] 


    -- Parse a string to a string 
    stringLit :: Parsec String u String 
    stringLit = between (char '"') (char '"') $ many1 $ noneOf "\"\n" 

    -- Parse a string to a list of strings 
    listOfStrings :: Parsec String u [String] 
    listOfStrings = stringLit `sepBy` (char ',' >> spaces) 

    -- Parse a string to an int 
    intLit :: Parsec String u Int 
    intLit = fmap read $ many1 digit 
    -- Or `read <$> many1 digit` with Control.Applicative 
    stringIntTuple :: Parsec (String , Int) 
    stringIntTuple = liftM2 (,) stringLit intLit 

    film :: Parsec String u Film 
    film = do 

title <- stringLit 
newline 
director <- stringLit 
newline 
year <- intLit 
newline 
userRatings <- stringIntTuple 
newline 
return (title, director, year, userRatings) 
+0

Veuillez ne pas poster la même question plusieurs fois. Stack Overflow a des mécanismes pour attirer l'attention sur une question existante. – Jubobs

Répondre

0

Le message d'erreur revient à dire que vous n'avez pas fourni suffisamment d'arguments de type. Et si vous comparez la signature de votre analyseur tuple avec les autres, vous verrez pourquoi:

stringLit :: Parsec String u String 
listOfStrings :: Parsec String u [String] 
stringIntTuple :: Parsec (String , Int) 

Dans tous les autres cas, vous fournir trois arguments de type, mais pour stringIntTuple vous fournissez un seul.

Alors ajoutez simplement String et u comme les deux premiers arguments, comme vous l'avez fait pour les autres, et ça marchera.

+0

merci! si évident cependant: P – Max