这段代码有什么问题,它在案例陈述中
loop :: Table -> IO ()
loop table = do
putStr "Command: "
x <- getLine
case x of
"add" -> do putStr "Key: "; y <- getLine; putStr "Value: "; z <- getLine; add y z table; loop table
add :: Key -> Value -> Table -> Table
add key v table | table == empty = [(key, v)]
| otherwise = ((key, v) : remove key table)
type Table = [(Key,Value)]
type Key = String
type Value = String
remove :: Key -> Table -> Table
remove key ((a, b) :table)
| key ==a = table
| ((a, b) :table) == empty = empty
| otherwise = ((a, b) : remove key table)
答案 0 :(得分:6)
这是你的功能(重新格式化了一下):
loop table = do
putStr "Command: "
x <- getLine
case x of "add" -> do
putStr "Key: "
y <- getLine
putStr "Value: "
z <- getLine
add y z table
loop table
问题是add y z table
不是像以前的putStr
那样的IO动作。您似乎认为对add
的调用实际上修改了表,但它没有!
至于修复它:尝试将add
的结果分配给let
子句中的某些内容。我不打算拼出来,因为这看起来像是家庭作业。
答案 1 :(得分:1)
我的猜测是value y table
应为putStrLn (value y table)
。
就目前情况而言,你正在查找价值,但没有做任何回答你得到的答案。
答案 2 :(得分:0)
假设你有
type Key = String
在某处,你的价值功能在这里很模糊:
| lookup key ((a,b) : table) == Just b = b
这肯定可以简化为
| key == a = b
答案 3 :(得分:0)
remove
remove :: Key -> Table -> Table
remove key ((a, b) : etable)
| key == a = table
| ((a, b) : table) == empty = empty
| otherwise = ((a, b) : remove key table)
问问自己应该为empty
测试什么?如果a
中未显示table
,会发生什么?