В Haskell, почему вы не используете "in" с "let" внутри блока do, но в противном случае вы должны?
Например, в несколько надуманных примерах ниже:
afunc :: Int -> Int
afunc a =
let x = 9 in
a * x
amfunc :: IO Int -> IO Int
amfunc a = do
let x = 9
a' <- a
return (a' * x)
Это достаточно простое правило помнить, но я просто не понимаю причину этого.