我正在学习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”从“正在进行”状态更改为“已完成”,所以下次我将设置getLine输入名称“SERIAL”。我仍然有点困惑这样做
filTering :: [ProjAdmin]->[ProjAdmin]
filTering = filter(\s-> projstatus s == "ongoing")
这是我主要
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变压器来做这件事?或者如果你知道后,已经回答或网页链接,请让我知道
谢谢你之前
2条答案
按热度按时间frebpwbc1#
您已经非常接近了!下面是错误行的更正版本:
为了让您在Google上搜索愉快,这被称为“记录更新语法”。
k10s72fa2#
在Haskell中,所有的值都是不可变的,所以要“更新”某个值,你需要编写一个函数,它实际上会根据旧值产生一个新值。
下面是
filtering :: [ProjAdmin]->[ProjAdmin]
的一个实现(如果你真的想让这个函数具有这种类型):当然,编写这样的函数是乏味的,所以您可能想看看“镜头”的主题。