递归过程中元组列表中的元素丢失,并且警卫队没有条件接手

查德兹

我遇到一个问题,即我有一个数据库,其中包含与歌曲,艺术家和销售人物的存储有关的元组列表。我必须使用songName和artistName在列表中进行迭代,如果它们在数据库中,则必须将销售值加1,并将其与数据库中的其他元组一起输出。如果songName和artistName不在数据库中,则我必须输出数据库中的元组以及包含输入的songName,artistName和first sale的新元组,例如[("Heartbeat","Kelly Clarkson",7), ("Rise","The Shadows",15), ("Hello", "Adele", 1)]

我对这个问题的解决方案如下:

testData :: [Sales]
testData = [ ("No Lie", "Sean Paul feat. Dua Lipa",  100)
           , ("Yes Lie", "Sean Paul feat. Dua Lipa",  10)
           , ("Fear & Delight", "The Correspondents",  120) ]



recordSale :: [Sales] -> String -> String-> [Sales]

recordSale [dataSet] trackName artistName = [(trackName, artistName, 1)]
recordSale ((track, artist, qty): xs) trackName artistName 
     | track == trackName && artist == artistName = xs ++ [(track, artist, qty + 1)]
     | otherwise = recordSale xs trackName artistName
     | track /= trackName && artist /= artistName = xs ++ [(track, artist, 1)]

我写了一个带有警卫的递归函数,试图在数据集中找到songName和artistName,但是我有一个奇怪的意外输出。

输入数据时,我的输出很奇怪。如果我要输入recordSale testData "Yes Lie" "Sean Paul feat. Dua Lipa",程序将输出[("Fear & Delight","The Correspondents",120),("Yes Lie","Sean Paul feat. Dua Lipa",11)]接受问题1中描述的预期的缺少元素问题,这是可以预期的。

但是,如果我要进入recordSale testData "Fear & Delight" "The Correspondents",我将得到异常的行为或被返回[("Fear & Delight","The Correspondents",1)]鉴于这首歌在数据库中,我希望销售数字能增加1。

鉴于只输出了歌曲,而不是附加到列表中的歌曲,我认为这可能是由我的基本情况引起的,recordSale [dataSet] trackName artistName = [(trackName, artistName, 1)]但我对此不十分确定

我如何返回未包含销售1的列表中的歌曲,以及当成功查询返回到数据库中时将其返回1来停止成功查询吗?

编辑:

替换为recordSale [dataSet] trackName artistName = []recordSale [dataSet] trackName artistName = [(trackName, artistName, 1)]以更准确地反映我在问题2中遇到的问题。

编辑2:编辑问题2的措词,使其更“易读”。

编辑3:减少为一个问题。

Henri Menke

您的代码有两个问题。首先是守卫

     | otherwise = recordSale xs trackName artistName
     | track /= trackName && artist /= artistName = xs ++ [(track, artist, 1)]

什么情况是,当对trackNameartistName不完全匹配,该列表将被截断,因为你只传递xs处理模式完全不匹配的第二行将永远不会被击中,因为模式是有序的并且otherwise是万能的。(无论如何,实现都是错误的,因为只要当前元素不匹配,它都会附加一个新元素)

另一个问题是模式

recordSale [dataSet] trackName artistName = [(trackName, artistName, 1)]

当列表仅包含一个元素时,这将匹配,但是如果该元素是匹配项,该怎么办?目前,此情况已被忽略,计数仅设置为1。

因此,我提出以下建议:

(我还用列表++构造替换了列表串联:因为它节省了一些键入操作,并消除了一些混乱情况)

type Sales = (String, String, Int)

testData :: [Sales]
testData = [ ("No Lie", "Sean Paul feat. Dua Lipa",  100)
           , ("Yes Lie", "Sean Paul feat. Dua Lipa",  10)
           , ("Fear & Delight", "The Correspondents",  120) ]

recordSale :: [Sales] -> String -> String-> [Sales]
recordSale [] trackName artistName = [(trackName, artistName, 1)]
recordSale ((track, artist, qty): xs) trackName artistName 
     | track == trackName && artist == artistName = (track, artist, qty + 1) : xs
     | otherwise = (track, artist, qty) : recordSale xs trackName artistName

在该otherwise子句中,我不会丢弃当前元素,而是使用递归的其余部分构造一个列表。另一个重要的变化是基本情况。我不匹配一个元素的列表,而是匹配空列表并返回插入了新项目的列表。

Wandbox上的实时示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何有条件地从元组列表中删除元素?

来自分类Dev

有条件地对元组列表中的值求和

来自分类Dev

有条件地对元组列表中的值求和

来自分类Dev

无法安装警卫队

来自分类Dev

无法安装警卫队

来自分类Dev

在Scheme中为“包括警卫队”推荐的模式?

来自分类Dev

在Scheme中为“包括警卫队”推荐的模式?

来自分类Dev

在迭代过程中有条件地删除自定义对象ArrayList元素

来自分类Dev

有条件地操纵数组中元素的属性

来自分类Dev

使用警卫队关键字

来自分类Dev

TypeScript有条件地映射元组可选元素

来自分类Dev

在xpath中没有条件

来自分类Dev

警卫队:条件绑定的初始化程序必须是可选类型,而不是“ ClassName”

来自分类Dev

删除带有条件的列中的元组

来自分类Dev

如何在AASM中在州一级设置警卫队

来自分类Dev

MySQL中的存储过程带有条件变量

来自分类Dev

Oracle:PLS-00103在有条件的过程中发生

来自分类Dev

对新元素有条件的列表理解

来自分类Dev

对新元素有条件的列表理解

来自分类Dev

如何使用迭代器有条件地从列表中删除元素?

来自分类Dev

如何找到有条件的海龟列表中的最大元素

来自分类Dev

有条件的方案递归

来自分类Dev

警卫队不向咆哮发送GNPP通知

来自分类Dev

为什么禁止在警卫队内使用远程功能

来自分类Dev

如何有条件地将一个列表中的元组附加到另一个元组列表中?

来自分类Dev

Rails读取没有关系的记录,并且有条件的记录

来自分类Dev

有条件地删除向量中的元素

来自分类Dev

有条件地删除向量中的元素

来自分类Dev

从另一个列表中删除带有条件的嵌套列表中的元素-Java 8

Related 相关文章

热门标签

归档