如何在列表中连接用户输入

Mar*_*cio 2 recursion haskell list

我想从用户那里获取代码并将其插入列表中,但问题是当用户说不想插入更多代码时.我没有保存带有数字的列表,因为我正在使用递归再次调用该方法,所以当我应该返回列表时我没有它.

insertCode :: [Integer]
insertCode = do
    putStrLn "Code:"
    code <- getLine
    putStrLn "Another? (Y/N)"
    if(resp == "Y" || resp == "y") then (read code::String->Integer):insertCode else --I don't know
Run Code Online (Sandbox Code Playgroud)

我很抱歉我的愚蠢问题,我想这很明显,但是我遇到了函数式编程的问题

che*_*ner 7

首先,您的类型签名是错误的.insertCode使用IOmonad,所以类型必须是IO [Integer].你也错过了code从a String到a 的转换Integer(我readLn用来完成它;你试图转换code成一个函数,而不是一个Integer),你错过了一个getLine来自用户的Y/N响应.

修复后,您可能会编写如下内容:

insertCode :: IO [Integer]
insertCode = do
    putStrLn "Code:"
    code <- readLn
    putStrLn "Another? (Y/N)"
    response <- getLine
    result <- if (response == "Y" || response == "y")
              then insertCode
              else return []
    return (code : result)
Run Code Online (Sandbox Code Playgroud)

这有点冗长,但试图明确如何使用monad.无论用户输入Y还是N,都code必须附加到从monad中提取的列表:从递归使用中提取的列表insertCode或显式空列表.