Home > Software engineering >  parse error on input ‘=’ Perhaps you need a 'let' in a 'do' block? e.g. 'le
parse error on input ‘=’ Perhaps you need a 'let' in a 'do' block? e.g. 'le

Time:11-06

in haskell, I get this error, and the tabulation is correct as I think

main = do
 archivo <- openFile "09septiembre2019.txt" ReadMode
 contenido  <- hGetContents archivo
 let lineas = lines String archivo
      registros = filter filtrarRenglones lineas
      matrizHorarios = map words registros
      matrizHorariosFiltrada = map (map (filter (`notElem` "\"\""))) matrizHorarios
      tuplas = map hacerTuplas matrizHorariosFiltrada
      diaFecha = map (unirStrings . take 1) tuplas
      horarios = map (tomarTuplas . drop 1) tuplas
      horasSumadas = map (map sumarHoras) horarios
      horasAcumuladas = map sum horasSumadas
      horasNormalizadas = map normalizar horasAcumuladas
      stringHoras = map show horasNormalizadas
      resultado = zip diaFecha stringHoras
      stringRegistrosEmpleados = map mostrarResultado resultado
      intCantidadEmpleados = length $ filter buscarCantEmpleados lineas
      stringCantidadEmpleados = ["Total de empleados listados: "    show intCantidadEmpleados]
      floatHorasAcumuladas = fromIntegral (sum horasAcumuladas) / 60
      stringHorasAcumuladas =  ["\nCantidad de horas acumuladas en el mes: "    show floatHorasAcumuladas    " hs"]
      floatHorasHombre =  floatHorasAcumuladas / fromIntegral intCantidadEmpleados
      stringHorasHombre = ["\nCantidad de horas/hombre en el mes: "    show floatHorasHombre    " hs"]
      intAvgHorasHombre = floatHorasHombre / 20
      stringAvgHorasHombre = ["\nPromedio diario de horas/hombre: "    show intAvgHorasHombre    " hs"]
      informe = stringRegistrosEmpleados    stringCantidadEmpleados    stringHorasAcumuladas    stringHorasHombre    stringAvgHorasHombre
 putStrLn $ unlines informe          
 hClose archivo

and the error is: parse error on input ‘=’ Perhaps you need a 'let' in a 'do' block? e.g. 'let x = 5' instead of 'x = 5'

CodePudding user response:

Let's reproduce your problem with something that we can easily fully compile:

main = do
  i <- return 2
  j <- return 4
  let sum = i   j
       mult = i * j
  putStrLn $ "Sum: "    (show sum)
  putStrLn $ "Multiplication: "    (show mult)

If I try to load this file on the ghci:

λ> :l 69859274-2.hs
[1 of 1] Compiling Main             ( 69859274-2.hs, interpreted )

69859274-2.hs:5:13: error:
    parse error on input ‘=’
    Perhaps you need a 'let' in a 'do' block?
    e.g. 'let x = 5' instead of 'x = 5'
  |
5 |        mult = i * j
  |             ^
Failed, no modules loaded.

Fixing it:

main = do
  i <- return 2
  j <- return 4
  let sum = i   j
      mult = i * j
  putStrLn $ "Sum: "    (show sum)
  putStrLn $ "Multiplication: "    (show mult)

And loading again:

λ> :l 69859274-2.hs
[1 of 1] Compiling Main             ( 69859274-2.hs, interpreted )
Ok, one module loaded.
λ> main
Sum: 6
Multiplication: 8

Notice I am using two spaces columns. You are using one space columns.

Using an abridged version of your code:

main = do
 archivo <- openFile "09septiembre2019.txt" ReadMode
 contenido  <- hGetContents archivo
 let lineas = lines String archivo
     registros = filter filtrarRenglones lineas
     matrizHorarios = map words registros
     matrizHorariosFiltrada = map (map (filter (`notElem` "\"\""))) matrizHorarios
     tuplas = map hacerTuplas matrizHorariosFiltrada
     // all other bindings starting at the same column as this comment...
     // ....
 putStrLn $ unlines informe          
 hClose archivo

CodePudding user response:

Yes, i move all the lines to the left, I stay like this:

main = do
 archivo <- openFile "09septiembre2019.txt" ReadMode
 contenido  <- hGetContents archivo
 let lineas = lines String archivo
 registros = filter filtrarRenglones lineas
 matrizHorarios = map words registros
 matrizHorariosFiltrada = map (map (filter (`notElem` "\"\""))) matrizHorarios
 tuplas = map hacerTuplas matrizHorariosFiltrada
 diaFecha = map (unirStrings . take 1) tuplas
 horarios = map (tomarTuplas . drop 1) tuplas
 horasSumadas = map (map sumarHoras) horarios
 horasAcumuladas = map sum horasSumadas
 horasNormalizadas = map normalizar horasAcumuladas
 stringHoras = map show horasNormalizadas
 resultado = zip diaFecha stringHoras
 stringRegistrosEmpleados = map mostrarResultado resultado
 intCantidadEmpleados = length $ filter buscarCantEmpleados lineas
 stringCantidadEmpleados = ["Total de empleados listados: "    show intCantidadEmpleados]
 floatHorasAcumuladas = fromIntegral (sum horasAcumuladas) / 60
 stringHorasAcumuladas =  ["\nCantidad de horas acumuladas en el mes: "    show floatHorasAcumuladas    " hs"]
 floatHorasHombre =  floatHorasAcumuladas / fromIntegral intCantidadEmpleados
 stringHorasHombre = ["\nCantidad de horas/hombre en el mes: "    show floatHorasHombre    " hs"]
 intAvgHorasHombre = floatHorasHombre / 20
 stringAvgHorasHombre = ["\nPromedio diario de horas/hombre: "    show intAvgHorasHombre    " hs"]
 informe = stringRegistrosEmpleados    stringCantidadEmpleados    stringHorasAcumuladas    stringHorasHombre    stringAvgHorasHombre
 putStrLn $ unlines informe          
 hClose archivo

and I have the same mistake

  • Related