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

Haskell如何将函数输入值添加到全局列表实现任务管理功能

你当前的实现方案不可行,核心原因有两点:

  1. Haskell 中的顶级绑定是不可变的,你预定义的mytasklist = []永远是空列表,无法在后续逻辑中修改它的取值
  2. 你在buildList中生成的updatedTasks没有传递给后续调用的main函数,任务数据在函数返回后直接丢失,后续的打印、搜索逻辑根本拿不到新增的任务。

Haskell 不依赖可变全局变量传递状态,正确的实现思路是:把任务列表作为状态参数,在主循环的递归调用中传递即可,以下是可直接运行的完整实现:

-- 搜索功能需要导入isInfixOf工具函数
import Data.List (isInfixOf)

-- 主循环:接收当前任务列表作为参数,处理用户操作
loop :: [String] -> IO ()
loop tasks = do
   putStrLn "Below are the Options:\n\tadd\n\tprint\n\tsearch\nEnter Option:"
   input <- getLine 
   if input == "add" then do
       putStrLn "Enter a Task:"
       task <- getLine
       -- 生成新的任务列表,传给下一轮循环,:操作符比++拼接效率更高
       loop (task : tasks)
   else if input == "print" then do
       putStrLn "All tasks:"
       -- reverse是因为每次任务加在列表头部,反转后和录入顺序一致
       mapM_ putStrLn $ reverse tasks
       -- 打印不修改任务列表,直接传原列表进入下一轮循环
       loop tasks
   else if input == "search" then do
       putStrLn "Enter keyword to search:"
       keyword <- getLine
       putStrLn "Matching tasks:"
       -- 过滤包含关键词的任务并打印
       mapM_ putStrLn $ filter (keyword `isInfixOf`) tasks
       loop tasks
   else do
       putStrLn "Please Enter add, print, search"
       loop tasks

-- 程序入口,初始任务列表为空
main :: IO ()
main = loop []

如果你需要单独拆分出buildList函数,可以按如下方式修改:

buildList :: [String] -> IO [String]
buildList oldTasks = do
    putStrLn "Enter a Task:"
    input <- getLine
    -- 返回更新后的任务列表
    return (input : oldTasks)

对应的add分支调整为:

if input == "add" then do
    newTasks <- buildList tasks
    loop newTasks

内容的提问来源于stack exchange,提问作者AMCode96

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:15:03