在Haskell中更新文件中的数据

goqiplq2  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(191)

我正在学习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变压器来做这件事?或者如果你知道后,已经回答或网页链接,请让我知道
谢谢你之前

frebpwbc

frebpwbc1#

您已经非常接近了!下面是错误行的更正版本:

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

为了让您在Google上搜索愉快,这被称为“记录更新语法”。

k10s72fa

k10s72fa2#

在Haskell中,所有的值都是不可变的,所以要“更新”某个值,你需要编写一个函数,它实际上会根据旧值产生一个新值。
下面是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

当然,编写这样的函数是乏味的,所以您可能想看看“镜头”的主题。

相关问题