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)
我很抱歉我的愚蠢问题,我想这很明显,但是我遇到了函数式编程的问题
首先,您的类型签名是错误的.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或显式空列表.