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

时间:2017-03-28 13:32:58

标签: list haskell recursion

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

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

我很抱歉我的愚蠢问题,我想这很明显,但我的功能编程存在问题

1 个答案:

答案 0 :(得分:7)

首先,您的类型签名是错误的。 insertCode使用IO monad,因此类型必须为IO [Integer]。您还错过了codeStringInteger的转换(我使用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"?> 中提取的列表,或显式空列表。