gpt4 book ai didi

haskell - 从 haskeline 中调用网络 IO

转载 作者:行者123 更新时间:2023-12-02 15:51:55 26 4
gpt4 key购买 nike

我有一个现有程序,它接受命令行参数(用户名、密码、日期),然后使用 Network.HTTP.Conduit 库将 xml 消息发布到服务器。然后我解析结果,做一些工作并使用 blaze-html 写入文件。

这一切都像一个魅力;但是,我想我应该使用 haskeline 以便密码不可见。我可以创建一个命令行程序来获取用户提供的值并将其打印出来,但如果我调用使用管道的函数,它永远不会返回。

这是有问题的代码:

main = runInputT defaultSettings loop
where
loop :: InputT IO ()
loop = do
Just username <- getInputLine "WM username: "
Just password <- getPassword (Just '*') "WM password: "
Just date <- getInputLine "Date (YYYYMMDD): "

outputStrLn "querying WM..."
clients <- lift $ getWMClients username password
outputStrLn "successfully retrieved client list from WM..."

let outHeader = renderHeader date username

reportString <- mapM (\x -> createString x clients) cList

lift $ writeFile (date ++ "_report.html") (outHeader ++ concat reportString)
outputStrLn "Done"

函数getWMClients函数为:

getWMClients :: Username -> String -> IO [Client]
getWMClients username password = do
let f = [Size "-1", Skip "0"]
let fs = [Select "id",
Select "status",
Select "last-name",
Select "first-name",
]
let query = WMQuery {transaction=SHARE,service=Query,businessObject=CONT,field=f,fields=fs}

results <- doQuery username (Just password) Nothing (Just query)
rows <- xmlResultsToMaps results

let clients = map makeClient rows
return clients

当我运行该程序时,它卡在“正在查询 WM...”处,我认为 http-conduit 从未真正运行过。关于如何实现这项工作有任何提示吗?

提前致谢,尼尔

最佳答案

您声称它可以在 haskeline 之前使用硬编码的用户名、密码和日期。为了帮助调试,您可能无法将导管提升到 InputT 中。下面的操作还失败吗? (我没有编译这个,所以请随意修复语法错误...)

-- Isolate the haskeline monad to just the input part:
main = loop
where
loop :: IO ()
loop = do
(username,password,date) <- runInputT defaultSettings $ do
Just username <- getInputLine "WM username: "
Just password <- getPassword (Just '*') "WM password: "
Just date <- getInputLine "Date (YYYYMMDD): "
return (username,password,date)

putStrLn "querying WM..."
clients <- getWMClients username password
putStrLn "successfully retrieved client list from WM..."

let outHeader = renderHeader date username

putString <- mapM (\x -> createString x clients) cList

writeFile (date ++ "_report.html") (outHeader ++ concat reportString)
putStrLn "Done"

关于haskell - 从 haskeline 中调用网络 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11007383/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com