gpt4 book ai didi

list - 如何更新 Haskell 列表中的特定元组?

转载 作者:行者123 更新时间:2023-12-02 06:29:39 26 4
gpt4 key购买 nike

我是 Haskell 的初学者,我正在尝试创建一个函数来提高具有特定首字母的人的薪水,如下所示:

*Main> giveRaise 'A' 200 [('A',"Al",1000),('B',"Bob",1500)]

这会给出一个答案:

[('A',"Al",1200),('B',"Bob",1500)]

到目前为止,我的代码是这样的,但是当我尝试将初始 'g' 提高 n 时,我一直收到错误消息:

giveRaise :: Char -> Int -> [(Char, String, Int)] -> [(Char, String, Int)]
giveRaise g n [(g, z, m)]
= [(g, z, (m + n))]

最佳答案

您将修改列表中的任意元素,因此最坏的情况您将不得不循环。由于 递归 是 Haskell 中的循环方式,因此您编写 giveRaise 一个子句很奇怪。使用递归时,您总是有两种类型的子句:

  • 一个基本案例:我们找到了这个人,并给他们加薪;和
  • 一个递归案例:我们目前还没有找到那个人,因此继续寻找。

基本情况很简单:

giveRaise <b>pa</b> n ((<b>pb</b>,z,m)<b>:tail) | pa == pb</b> = (pb,z,m+n)<b>:tail</b>

在 Prolog 中,您可以在head 中使用相同的变量并完成统一(在 Erlang 中,检查是否相等)。这在 Haskell 中是不允许的。在 Haskell 中,使用 guards(如 | pa == pb)来确定两个人是否相同。

现在有另一个选择:pa 不是 pb。在 otherwise 的情况下,我们执行递归并在列表中进一步搜索,因此:

                               <b>| otherwise = (pb,z,m):giveRaise pa n tail</b>

或者放在一起:

giveRaise <b>pa</b> n ((<b>pb</b>,z,m)<b>:tail) | pa == pb</b> = (pb,z,m+n)<b>:tail</b>
<b>| otherwise = (pb,z,m):giveRaise pa n tail</b>

最后还有一个我们必须考虑的情况:如果我们到达列表末尾但没有找到那个人怎么办?我们可以简单地忽略它并返回空列表,如:

giveRaise _ _ [] = []

或者我们可以抛出一个错误:

giveRaise _ _ [] = error "Could not give a raise."

所以我们可以这样实现它:

giveRaise pa n ((pb,z,m):tail) | pa == pb = (pb,z,m+n):tail
| otherwise = (pb,z,m):giveRaise pa n tail
<b>giveRaise _ _ [] = error "Could not give a raise."</b>

最后请注意,此函数只会给第一个具有给定标识符的人加薪并非所有具有该标识符的人。然而,我假设标识符是唯一的。

关于list - 如何更新 Haskell 列表中的特定元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42720699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com