Haskell调用buildTasksList拼接列表时报类型不匹配错误如何解决
错误原因
buildTasksList内部用到了getLine、putStrLn这类IO操作,所以它的返回值是带IO上下文的IO [String]类型,不是纯列表[String]。++只能用于两个同类型的列表运算,你直接拿纯列表task和IO [String]做运算,类型匹配不上才报了Couldn't match type ‘[]’ with ‘IO’的错误。- Haskell是纯函数式语言,变量默认不可变,你定义的顶层
task = []是固定的空列表常量,不可能直接修改它的值追加内容,要持久化存储任务列表,需要把列表作为参数传给递归调用的主函数传递状态。
修正后的可运行代码
-- 搜索功能需要导入isInfixOf,不需要搜索功能可以删掉这行 import Data.List (isInfixOf) printTasks [] = do putStrLn "That's all the tasks!" printTasks (x : xs) = do putStrLn $ " " ++ x printTasks xs buildTasksList tasks = do putStrLn "Enter a task: " input <- getLine let newTasks = input : tasks return newTasks -- 把任务列表作为参数传递,实现状态持久化 mainWithTasks tasks = do putStrLn "Below are the options: \nadd\nprint\nsearch" option <- getLine case option of "add" -> do -- 用<-语法取出IO上下文包裹的任务列表 updatedTasks <- buildTasksList tasks mainWithTasks updatedTasks "print" -> do printTasks tasks mainWithTasks tasks "search" -> do putStrLn "Enter search keyword:" keyword <- getLine let matchedTasks = filter (keyword `isInfixOf`) tasks printTasks matchedTasks mainWithTasks tasks _ -> do putStrLn "Invalid option, please try again" mainWithTasks tasks main = mainWithTasks []
内容的提问来源于stack exchange,提问作者Abdulrazzaq
相关产品推荐
相关产品推荐

