2
votes

I get

parse error (possibly incorrect indentation or mismatched brackets)

on the line with | i > j = do swap axs p j

apartition :: Ord a => STArray s Int a -> Int -> Int -> ST s Int
apartition axs p q = do 
  x <- readArray axs p
  let loop i j
    | i > j = do swap axs p j
                 return j
    | otherwise = do u <- readArray axs i
                     if u < x 
                       then do loop (i + 1) j 
                       else do swap axs i j
                            loop i (j − 1)
  loop (p + 1) q

I am really confused about the cause of this, could someone clear things up for me?

1
@SimonShine: this is a do block, so the in is not necessary. - Willem Van Onsem

1 Answers

5
votes

This is an indentation error, you need to place the guard at least one character to the right of the start of the definition of loop, so:

apartition :: Ord a => STArray s Int a -> Int -> Int -> ST s Int
apartition axs p q = do 
  x <- readArray axs p
  let loop i j
       | i > j = do swap axs p j
                    return j
       | otherwise = do u <- readArray axs i
                        if u < x 
                        then do loop (i + 1) j 
                        else do swap axs i j
                                loop i (j - 1)
  loop (p + 1) q