Второе условие фильтрации не работает должным образом - Haskell - PullRequest
0 голосов
/ 07 августа 2020

У меня проблема с тем, что у меня есть список кортежей ("Song Name", "Artist Name", SalesFig), и мне нужно отфильтровать кортеж в этом списке, который содержит определенные c Имя песни и Имя исполнителя, и вернуть все другие кортежи в этом списке.

Ниже мой код:

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

filterTrack :: String -> String -> [(String, String, Int)] -> [(String, String, Int)]
filterTrack songName artistName items = filter p items
    where p (song', artist', _) = songName /= song' && artistName /= artist'

Теперь проблема, с которой я столкнулся с codee, заключается в том, что когда я хочу отфильтровать одну из двух песен в списке и ввести, скажем, filterTrack "Yes Lie" "Sean Paul feat. Dua Lipa" testData чтобы удалить "Yes Lie" из списка, программа удаляет и другую песню того же исполнителя, "No Lie".

Я не уверен, почему это происходит, так как у меня есть выражение, которое требует ввода чтобы не совпадать с songName and artistName. Я мог бы понять, почему это происходит, если бы было OR, а не AND, поскольку это было бы верно, если бы одно из условий было истинным.

Я бы подумал, что использование AND будет make так, что он возвращает каждый кортеж, который в точности не соответствует Song Name и Artist Name, а не только Artist Name

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Это ваша функция фильтрации:

p (song', artist', _) = songName /= song' && artistName /= artist'

Это эквивалентно этому псевдокоду:

NOT sameArtist AND NOT sameSong

Что, согласно теореме Де Моргана, эквивалентно:

NOT (sameArtist OR sameSong)

Это не то, что вы хотите, но объясняет поведение, которое вы видите.

То, что вы хотите, чтобы ваш фильтр был:

НЕ (sameArtist AND sameSong)

Что записывается как:

p (song', artist', _) = not (songName == song' && artistName == artist')
0 голосов
/ 07 августа 2020

Основываясь на подсказках от @arrowd, изменение where p (song', artist', _) = songName /= song' && artistName /= artist' на where p (song', artist', _) = songName /= song' || artistName /= artist' решило мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...