En Haskell, ¿cuándo lo usamos con let?

En el siguiente código, la última frase puedo poner unin Al frente. ¿Cambiará algo?

Otra pregunta: si decido ponerin delante de la última frase, ¿necesito sangrarla?

Lo intenté sin sangría y abrazos se queja

El último generador en do {...} debe ser una expresión

import Data.Char
groupsOf _ [] = []
groupsOf n xs = 
    take n xs : groupsOf n ( tail xs )

problem_8 x = maximum . map product . groupsOf 5 $ x
main = do t <- readFile "p8.log" 
          let digits = map digitToInt $concat $ lines t
          print $ problem_8 digits
Edita

Ok, entonces la gente no parece entender lo que digo. Permítanme reformular: ¿son los dos siguientes iguales, dado el contexto anterior?

1.

let digits = map digitToInt $concat $ lines t
print $ problem_8 digits

2.

let digits = map digitToInt $concat $ lines t
in print $ problem_8 digits

Otra pregunta sobre el alcance de los enlaces declarados enlet: Yo leoaqu ese

where Cláusulas.

A veces es conveniente abarcar los enlaces sobre varias ecuaciones protegidas, lo que requiere una cláusula where:

f x y  |  y>z           =  ...
       |  y==z          =  ...
       |  y<z           =  ...
     where z = x*x

enga en cuenta que esto no se puede hacer con una expresión let, que solo se extiende sobre la expresiónque encierra.

Mi pregunta: entonces, los dígitos variables no deberían ser visibles para la última frase impresa. ¿Echo de menos algo aquí?

Respuestas a la pregunta(4)

Su respuesta a la pregunta