我想从用户那里获取代码并将其插入列表中,但问题是当用户说不想插入更多代码时。我没有保存带有数字的列表,因为我正在使用递归再次调用该方法,所以当我应该返回列表时我没有它。
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
我很抱歉我的愚蠢问题,我想这很明显,但我的功能编程存在问题
答案 0 :(得分:7)
首先,您的类型签名是错误的。 insertCode
使用IO
monad,因此类型必须为IO [Integer]
。您还错过了code
从String
到Integer
的转换(我使用readLn
来完成此操作;您试图将code
转换为Integer
功能,而不是getLine
),您缺少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)
来获取用户的Y / N回复。
修复后,您可能会写下以下内容:
code
这有点冗长,但试图明确如何使用monad。无论用户输入Y还是N,都必须将insertCode
附加到从monad中提取的列表:从递归使用<?xml version="1.0" encoding="utf-8"?>
中提取的列表,或显式空列表。