过去几天我一直在试图学习Haskell。虽然我正在慢慢变好,但我发现很难用Haskell的IO进行推理,可能是由于我缺乏知识。我一直在努力编写一个简单的待办事项列表程序。下面是我得到了什么:Haskell类型错误消息
tadd todo = do
td <- getLine
td:todo
tdel todo = do
trem <- getLine
let rid = read trem :: Int
[todo !! x | x <- [0..(length todo-1)], not $ x == rid]
tls todo = do
mapM putStrLn [ (show x) ++ (todo !! x) | x <- [0..(length todo -1)] ]
todo
mtodo "add" todo = tadd todo
mtodo "del" todo = tdel todo
mtodo "ls" todo = tls todo
bege = do
com <- getLine
mtodo com []
main = bege
我的除外mtodo是mtodo :: [IO String] -> [IO String] -> [IO String]
和TADD,TDEL,TLS是:: [IO String] -> [IO String]
。
相反,我刚刚得到这个可怕的错误讯息话题
[1 of 1] Compiling Main (todo.hs, todo.o)
todo.hs:3:9:
Couldn't match type `[]' with `IO'
Expected type: IO String
Actual type: [String]
In a stmt of a 'do' block: td : todo
In the expression:
do { td <- getLine;
td : todo }
In an equation for `tadd':
tadd todo
= do { td <- getLine;
td : todo }
todo.hs:8:9:
Couldn't match expected type `IO' with actual type `[]'
In a stmt of a 'do' block:
[todo !! x | x <- [0 .. (length todo - 1)], not $ x == rid]
In the expression:
do { trem <- getLine;
let rid = ...;
[todo !! x | x <- [0 .. (length todo - 1)], not $ x == rid] }
In an equation for `tdel':
tdel todo
= do { trem <- getLine;
let rid = ...;
[todo !! x | x <- [0 .. (length todo - 1)], not $ x == rid] }
todo.hs:12:9:
Couldn't match type `[]' with `IO'
Expected type: IO [Char]
Actual type: [[Char]]
In a stmt of a 'do' block: todo
In the expression:
do { mapM
putStrLn [(show x) ++ (todo !! x) | x <- [0 .. (length todo - 1)]];
todo }
In an equation for `tls':
tls todo
= do { mapM
putStrLn [(show x) ++ (todo !! x) | x <- [0 .. (length todo - 1)]];
todo }
任何想法有什么错我的类型? (另外 - 有什么我应该改变?)。由于
回报是你的朋友 – zurgl 2013-02-14 15:11:07
明确键入东西!当你感到困惑时,它会让你更容易推理,因为它会迫使你问自己这样的问题,例如*我想让它返回哪种类型?*和*这是什么东西?*。 – gspr 2013-02-14 15:13:03
顺便说一下,通常最好使用空格代替Haskell代码的制表符,而不仅仅是因为它适用于复制粘贴到SO问题。 :] Haskell关心对齐,而不仅仅是缩进,并且标签的解释方式可能与您的编辑器显示它们的方式不匹配。 – 2013-02-14 15:37:35