代码错误haskell无法匹配预期类型`[(Key,Value)]'

时间:2011-03-30 12:32:44

标签: haskell

这段代码有什么问题,它在案例陈述中

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)

4 个答案:

答案 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,会发生什么?