我正在Haskell中编写一个回文解决方案,并且我希望该函数在输入null时显示错误。我不想使用错误功能,因为这会暂停程序。因此,我想显示使用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
我希望它会显示错误,但是只会给出错误。显示暂停安全错误的可能解决方案是什么?
答案 0 :(得分:4)
如果同时写入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 do
putStrLn "This is not a word!"
main
else do
putStrLn $ show $ checkPalindrome word
main
话虽如此,您可以通过在do
的{{1}}块的底部进行调用来简化上述操作:
main
或者我们可以像@Bergi says一样,在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
main
块中添加更多内容,例如:
main
如果编写时没有main = do
putStrLn "Hey there, What's up! ENTER WORD TO CHECK PALINDROME!"
word <- getLine
putStrLn $ if null word
then "This is not a word!"
else show $ checkPalindrome word
main
块,则Haskell旨在解析do
。因此,这意味着putStrLn "This is not a word!" main
应该具有类型putStrLn
,但事实并非如此。
通过使用String -> IO a -> IO a
块,Haskell将desugar the do block [Haskell'10 report]放入do
,这是合理的(至少对于类型系统而言)。由于绑定运算符的类型为(>>) :: Monad m => m a -> m b -> m b
。