Search code examples
haskellcompiler-errorsparse-error

Haskell - Getting Multiple Parse Errors


I recently completed a snakes and ladder game required for my school but my peer can perfectly compile this code while I get same error over and over again. I have tried many different approaches but I am not quite sure what else to do.

I tried downloading prior versions of Haskell and that did not help. I also installed lens package using "cabal install lens" and imported the Control.Lens package using ghci -> import Control.Lens before compiling the program.

When I try compiling the code, I get the following error. File name is Main.hs

ghc -o main Main.hs
[1 of 1] Compiling Main               ( Main.hs, Main.o )

Main.hs:6:1: parse error on input module

I am also attaching my code below. Thank you for anybody willing to help.

module Main where

import Data.List
import Data.Sequence
import Data.Foldable
import Control.Lens

data Game = G Int Int Int [Int] [Bool] [Bool] [Bool] [Int] [Property] Int
data Property = Int | E | A | D
displayRow game@(G rows cols nplayers pos e a d drolls props turn) n = unlines [ '+' : concat (replicate n "---+") , '|' : concat (replicate n "   |")]
display game@(G 0 cols nplayers pos e a d drolls props turn) = ""
display game@(G rows cols nplayers pos e a d drolls props turn) = (displayRow game cols) ++ display (G (rows - 1) cols nplayers pos e a d drolls props turn)
go game@(G rows cols nplayers pos e a d drolls props 0) _ = display game
go game@(G rows cols nplayers pos e a d drolls props turn) i
  | elem (rows*cols) pos = display game 
  | nplayers == i = go (G rows cols nplayers pos e a d drolls props (turn - 1)) 0 
  | otherwise = go (move (G rows cols nplayers pos' e a d (tail drolls) props turn) i roll) (i + 1) where
    roll = if d!!i then 2*(head drolls) else (head drolls)
move (G rows cols nplayers pos e a d drolls props turn) i j = case (elemIndex posij pos) of
  Just k -> (move (G rows cols nplayers pos' e' a' d' drolls props turn) k 1) 
  Nothing -> (G rows cols nplayers pos' e' a' d' drolls props turn) 
  where
    posij = if (pos!!i + j) > rows*cols then rows*cols else pos!!i + j 
    pos'
      | props!!posij > posij = if e!!i then pos & ix i .~ (2*(props!!posij) - posij) else pos & ix i .~ (props!!posij)
      | props!!posij < posij = if a!!i then pos & ix i .~ posij else pos & ix i .~ (props!!posij)
      | otherwise = pos & ix i .~ posij
    e'
      | props!!posij > posij = if e!!i then e & ix i .~ False else e
      | props!!posij == E = e & ix i .~ True
      | otherwise = e
    a'
      | props!!posij < posij = if a!!i then a & ix i .~ False else a
      | props!!posij == A = a & ix i .~ True
      | otherwise = a
    d' = if (props!!posij) == D then (d & ix i .~ True) else (d & ix i .~ False)
instance Show Game where
  show game@(G rows cols nplayers pos e a d drolls props turn) = go game 0 
build (l:ls) = build' (G 0 0 0 [] [] [] [] [] [] 0) (l:ls) where
  build' game (l:ls) = build' (update game l) ls
  build' game [] = game
  update (G rows cols nplayers pos e a d drolls props turn) s = case (words s) of
                    "board":l -> G (nums!!0) (nums!!1) nplayers pos e a d drolls [i | i <- [0..(nums!!0)*(nums!!1)]] turn
                    "players":l -> G rows cols (nums!!0) [0 | _ <- [1..(nums!!0)]] [False | _ <- [1..(nums!!0)]] [False | _ <- [1..(nums!!0)]] [False | _ <- [1..(nums!!0)]] drolls props turn
                    "dice":l -> G rows cols nplayers pos e a d (cycle nums) props turn
                    "ladder":l -> G rows cols nplayers pos e a d drolls (props & ix (nums!!0) .~ (nums!!1)) turn
                    "snake":l -> G rows cols nplayers pos e a d drolls (props & ix (nums!!0) .~ (nums!!1)) turn
                    "powerup":"escalator":l -> G rows cols nplayers pos e a d drolls (over (elements (flip elem nums)) (const E) props) turn
                    "powerup":"antivenom":l -> G rows cols nplayers pos e a d drolls (over (elements (flip elem nums)) (const A) props) turn
                    "powerup":"double":l -> G rows cols nplayers pos e a d drolls (over (elements (flip elem nums)) (const D) props) turn
                    "turns":l -> G rows cols nplayers pos e a d nums props (turn + (nums!!0)) where
                      nums = map read l :: [Int]
readFrom input = build (lines input)
main = do
  input <- getContents
  putStr $ show $ readFrom input

Solution

    • module line must be above imports
    • Don't need to indent everything after the where on the module line
    • Put a blank line between every function/data decl/instance for readability
    • Provide a type signature on every function
    • Do not wait to compile until you are done writing, you should compile and test incrementally so you can fix design flaws with minimal effort
    • Compile with the -Wall flag to give you reasonable suggestions on changes that would improve readability

    Once you clean it up into a workable state, you can see what type errors you get and work on fixing those.