Parse error on input 'Show'

haskell

Solution

There are number of issues with your code:

1) `type` is used for creating new name for an existing type. But in your case, this will result in compilation error because you are trying to define new data constructor here:

type Book = ABook Genre Name String Date Int deriving (Show)

So, use the `data` keyword to create proper type and data constructor. i.e:

data Book = ABook Genre Name String Date Int deriving Show

2) There is a problem with your function `year` :

year :: Book -> Int     
year b = let (_ , _ , b) = date b in y

As you see, there is no `y` there. Probably you meant something like this:

year b = let (_ , _ , y) = date b in y

With that being said, you should use the record syntax instead of manually creating helper function.

data Book = ABook {
  genre :: Genre,
  author :: Name,
  title :: String,
  date :: Date
}

Here, you get free accessor functions named `genre` , `author`, etc without writing them yourself.

Problem

i have written the follwing code: ``` data Genre = Nonfiction | Novel | Biography deriving (Eq, Show) type Name = (String, String) type Date = (Int, Int, Int) type Book = ABook Genre Name String Date Int deriving Show genre :: Book -> Genre genre (ABook g _ _ _ _) = g author :: Book -> Name author (ABook _ a _ _ _) = a title :: Book -> String title (ABook _ _ t _ _) = t date :: Book -> Date date (ABook _ _ _ d _) = d pages :: Book -> Int pages (ABook _ _ _ _ p) = p year :: Book -> Int year b = let (_ , _ , b) = date b in y publishedIn :: Int -> [Book] -> [Book] publishedIn x xs = filter findYear xs findYear:: Book -> Bool findYear x | year x == 2014 = True | otherwise = False ``` The functions from genre until year are helpfunctions which I try to include in the higher order functions like filter etc. But the compiler shows me the following error message: ``` Parse error on input 'Show' ``` What can I do against that ?

Original source