Используйте let
вместо where
:
{-# LANGUAGE ScopedTypeVariables #-}
main = do
putStrLn "Please input a number a: "
a :: Int <- readLn
print a
putStrLn "Please input a number b: "
b :: Int <- readLn
print b
let c = b^2
putStrLn ("a+b+b^2:" ++ (show $ a+b+c))
Причина проблемы заключается в том, что переменные в предложении where
находятся в области действия для всех main
, но b
не входит в сферу применения до b :: Int <- readLn
. В общем случае предложения where
не могут ссылаться на переменные, связанные внутри блока do
(или в любом месте справа от =
, в этом отношении: например, f x = y*2 where y = x+1
- это хорошо, но f = \x -> y*2 where y = x+1
- нет) .