Если вы пишете и putStrLn "this is not a word!"
, и main
, вы должны использовать здесь блок do
:
main = do
putStrLn "Hey there, What's up! ENTER WORD TO CHECK PALINDROME!"
word <- getLine
if null word
then <b>do</b>
putStrLn "This is not a word!"
main
else do
putStrLn $ show $ checkPalindrome word
main
При этом вы можете упростить вышесказанное, позвонив понижняя часть блока do
блока main
:
main = do
putStrLn "Hey there, What's up! ENTER WORD TO CHECK PALINDROME!"
word <- getLine
if null word
then putStrLn "This is not a word!"
else putStrLn $ show $ checkPalindrome word
<b>main</b>
или мы можем, как @ Берги говорит , даже поместить больше в блок main
, например:
main = do
putStrLn "Hey there, What's up! ENTER WORD TO CHECK PALINDROME!"
word <- getLine
<b>putStrLn $</b> if null word
then "This is not a word!"
else show $ checkPalindrome word
main
Если вы напишите это без блока do
, Haskell попытается проанализировать putStrLn "This is not a word!" main
.Таким образом, это означает, что putStrLn
должен иметь тип String -> IO a -> IO a
, но это не так.
Используя блок do
, Haskell будет десагарровать блок do [Haskell'10отчет] в putStrLn "This is not a word!" >> main
, и это звук (по крайней мере, для системы типов).Так как оператор связывания имеет тип (>>) :: Monad m => m a -> m b -> m b
.