重复附加到字符串haskell

重复附加到字符串haskell,haskell,Haskell,嗨,我是哈斯凯尔的新手,不知道该怎么做。到目前为止,我有以下代码 ask :: String -> IO () ask prompt = do putStrLn prompt line <- getLine if line == "" then ask "please try again" else putStrLn ("you said: " ++ reverse line) main :: IO () main = do ask "ple

嗨,我是哈斯凯尔的新手,不知道该怎么做。到目前为止,我有以下代码

ask :: String -> IO ()
ask prompt =
  do
  putStrLn prompt
  line <- getLine
  if line == ""
    then ask "please try again"
    else putStrLn ("you said: " ++ reverse line)

main :: IO ()
main =
  do
  ask "please say something"
ask::String->IO()
询问提示=
做
putStrLn提示符

line您可以在方法中添加计数器,如:

ask :: String -> IO ()
ask = ask' 1

ask' :: Int -> String -> IO ()
ask' n prompt = do
  putStrLn prompt
  line <- getLine
  if null line
    then ask' (n+1) ("please try again" ++ replicate n '!')
    else putStrLn ("you said: " ++ reverse line)
ask::String->IO()
ask=ask'1
询问'::Int->String->IO()
ask'n prompt=do
putStrLn提示符
行而不是将一个提示传递给
询问
,而是以由
迭代
生成的无限列表的形式传递所有提示:

ask :: [String] -> IO ()
ask (p:ps) =
  do
  putStrLn p
  line <- getLine
  if line == ""
    then ask ps
    else putStrLn ("you said: " ++ reverse line)

main :: IO ()
main =
  do
  ask ("please say something" : iterate (++"!") "please try again")
ask::[String]->IO()
提问(p:ps)=
做
putStrLn p

行只是为了用另一种方法做出贡献

你想做两件事

  • 一种是反向打印给定的字符串
  • 另一种是处理错误,每次打印一条新的错误消息
让我们定义这两个动作:

-- This prints the given line backwards
putReverse :: String -> IO ()
putReverse line = putStrLn $ "you said: " ++ reverse line

-- Given an error message an a IO action, prints the message an execute the IO
askAgain :: String -> IO () -> IO ()
askAgain errorMessage io = putStrLn errorMessage >> io

ask
功能接收所需的错误消息作为输入。它请求一条线并处理每个案例。调用
askAgain
时,io操作与
ask
功能相同,但有新的错误信息

ask :: String -> IO ()
ask errorMessage = do
  line <- getLine
  if line == ""
    then askAgain errorMessage $ ask (errorMessage ++ "!") -- here is where you update the error message
    else putReverse line

main :: IO ()
main = do
  putStrLn "please say something" -- optionally this prompt can but an argument for ask function. Try to refactor as an exercise!!
  ask "please try again"
ask::String->IO()
ask errorMessage=do
线