import Data.Char
-- Sample test data
testData :: [Movies]
testData = [("Me and My Broken Heart","Rixton"),
("It’s My Birthday","will.i.am"),
("Problem","Ariana Grande")]
-- record a sale of a track
record :: [Movies] -> String -> String
record t a = []
record ((t, a): xs) a a
| t == a && a == a = [(t,a)]
| otherwise = record xs a t
Run Code Online (Sandbox Code Playgroud)
正确的输出应该是数据库的修改版本.
首先,因为看起来你正在学习,关于风格的一些注意事项:在这种情况下,以单数形式命名一个销售是一种惯例,并且它们的列表带有复数,即:
type Sale = (String, String, Int)
type Sales = [Sale]
Run Code Online (Sandbox Code Playgroud)
更好的是,人们常常(取决于预期的用途和品味)变成新类型Sale或完整的ADT,因为这样可以提供更多的抽象和类型安全性.
其次,对于您的实际问题:您所看到的行为来自模式匹配的顺序.在你的第一场比赛中,
recordSale testData aTitle anArtist = []
Run Code Online (Sandbox Code Playgroud)
testDate在第二个模式可以应用之前匹配任何列表,也可以是非空列表.改为
recordSale [] _ _ = []
Run Code Online (Sandbox Code Playgroud)
而且你不会再得到空名单了.另外,正如@Aleksandar指出的那样,在列表不为空但过滤条件不匹配的情况下,您不应忘记保留列表的init.