我已经定义了一个(String,Int)对的列表.
type PatientList = [(String,Int)]
Run Code Online (Sandbox Code Playgroud)
我需要以'name'和'number'的形式将数据添加到此列表中,其中number将在列表的每个添加中递增,例如,添加3个名称后的列表(或元组)将如下所示:
[("bob", 1), ("ted", 2), ("harry", 3)]
Run Code Online (Sandbox Code Playgroud)
将使用以下代码捕获名称:
do putStr "You are? "
name <- getLine
Run Code Online (Sandbox Code Playgroud)
我目前的解决方案是创建一个名单列表,例如(bob,ted,harry),然后使用zip,将这些列表组合如下:
zip = [1...]["bob","ted","harry"]
Run Code Online (Sandbox Code Playgroud)
此解决方案不符合我的要求,因为我希望在不同时间添加到列表中而不是组合在一起.我怎样才能做到这一点?
以相反的顺序保持列表不是更好吗?
[("harry", 3), ("ted", 2), ("bob", 1)]
Run Code Online (Sandbox Code Playgroud)
比添加将在恒定时间:
add :: PatientList -> String -> PatientList
add [] newName = [newName]
add ((oldName, x):xs) newName = (newName, x+1):(oldName, x):xs
Run Code Online (Sandbox Code Playgroud)
当你需要整个列表的顺序,你只需在O(lenght yourList)线性时间:
reverse patientList
Run Code Online (Sandbox Code Playgroud)