Как заставить putStrLn работать внутри блока if-else - PullRequest
2 голосов
/ 16 июня 2019

Я пишу палиндромное решение на Хаскеле, и я хочу, чтобы функция показывала ошибку, если вводится ноль.Я не хочу использовать функцию ошибки, поскольку она останавливает программу.Следовательно, я хочу показать сообщение об ошибке, используя putStrLn и продолжить цикл.

Я пытался использовать show, чтобы изменить ввод данных, заданный для putStrLn, но он не работает и выдает ошибку типа времени компиляции.

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!"
            main    
    else do
        putStrLn  $ show  $ checkPalindrome word
        main

checkPalindrome w = если обратный w ==w тогда True иначе False

Я ожидаю, что это покажет ошибку, но это только дает ошибку.Каковы возможные решения, чтобы показать ошибку остановки безопасности?

1 Ответ

4 голосов
/ 16 июня 2019

Если вы пишете и 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...