更新Haskell文件中的数据



我正在学习关于haskell中的CRUD,但我对更新数据感到困惑。到目前为止,这是我的数据类型

data ProjAdmin = RecordProjAdmin { projname :: String, animator :: String,
projstatus :: String} deriving (Show, Read)

这是数据样本

thisData :: [ProjAdmin]
thisData = [RecordProjAdmin {projname = "SERIAL", animator = "jet juy", projstatus = "ongoing"},
RecordProjAdmin {projname = "FIILER", animator = "jet juy", projstatus = "done"},
RecordProjAdmin {projname = "RECYCLE-TVS", animator = "jet juy", projstatus = "done"}]

这里的逻辑是,我想改变projname = "SERIAL"从"ongoing"状态为"完成",所以下次我将设置getLine输入名称为"serial"。我还是有点困惑,要么

filTering :: [ProjAdmin]->[ProjAdmin]
filTering = filter(s-> projstatus s == "ongoing")

this is my main

main ::IO ()
main  = do
let output = filTering thisData
let changedata = map (y -> if projstatus y=="ongoing" then projstatus y = "done" else projstatus y) output
print changedata

如果有任何创建更新功能的想法,我会非常高兴非常感谢,还是可以使用monad transformer来做这个?或者如果你知道已经发布的答案或网页链接,请告诉我

thank you before

你很接近了!以下是错误行的更正版本:

let changedata = map (y -> if projstatus y == "ongoing" then y { projstatus = "done" } else y) output

为了方便你在谷歌上搜索,这被称为"记录更新语法"。

在Haskell中,所有的值都是不可变的,所以要"update"你需要编写一个函数,根据旧值生成一个新值。

下面是filtering :: [ProjAdmin]->[ProjAdmin]的一个实现(如果你真的希望这个函数有这个类型):

filtering :: [ProjAdmin]->[ProjAdmin]
filtering inputs = map changeIfCond inputs
-- changes the value if its name is "SERIAL" and status is "ongoing"
changeIfCond :: ProjAdmin -> ProjAdmin
changeIfCond (RecordProjAdmin name anim status) =
if name == "SERIAL" && status == "ongoing"
then RecordProjAdmin name anim "done"
else RecordProjAdmin name anim status

当然,编写这样的函数很乏味,因此您可能需要查看"镜头"。话题。

最新更新