You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:27:06