【问题标题】:Parse Error on if statement in Haskell在 Haskell 中解析 if 语句的错误
【发布时间】:2018-07-26 23:53:19
【问题描述】:

这是一个学术作业,我根本无法解决它。

我有一个“曲目”(音乐记录)列表(数据库) - (Title,Artist,SalesNumber)的元组,我的任务是增加给定曲目的销售,如果它已经存在于数据库中(相同的标题和艺术家),只需将销售编号增加 1,或者如果尚不存在,则将其添加到数据库中。我已经编写了(我认为是正确的)函数来执行这些任务中的任何一个,但是我正在努力编写函数来确定是添加新记录还是简单地增加它并调用其中任何一个。

addNewTrack :: [Sale] -> Title -> Artist -> [Sale]
addNewTrack testDatabase title artist = testDatabase

incrExistingTrack :: [Sale] -> Title -> Artist -> [Sale]
incrExistingTrack testDatabase testedTitle testedArtist = []
incrExistingTrack ((title, artist, salesNumber): xs) testedTitle    testedArtist
 | testedTitle == title && testedArtist == artist =
 [(title, artist, salesNumber + 1)]
 | otherwise = incrExistingTrack xs title artist

recordSale :: [Sale] -> Title -> Artist -> [Sale]
recordSale testDatabase title artist
let trackExists = sameTrack title artist
if trackExists == True
 then incrExistingTrack title artist
 else addNewTrack title artist

sameTrack :: Title -> Artist -> Sale -> Bool
sameTrack queriedTitle queriedArtist (title, artist, salesNumber)
 | (queriedTitle == title) && (queriedArtist == artist) = True
 | otherwise = False

我的 recordSale 函数中的 if 语句在函数第四行的第一个字符上给出“解析错误(可能不正确的缩进或不匹配的括号)”有什么问题?

recordSale :: [Sale] -> Title -> Artist -> [Sale]
recordSale testDatabase title artist
let trackExists = sameTrack title artist
if trackExists == True
  then incrExistingTrack title artist
  else addNewTrack title artist

我一直在转移内容并更改缩进,但无济于事。我相信这一定是一个非常简单的错误。如何识别问题?我正在尝试做的事情是否有替代且可能更优雅的实现?

recordSale :: [Sale] -> Title -> Artist -> [Sale]
recordSale testDatabase title artist
  = let trackExists = sameTrack title artist
    in if trackExists == True
        then incrExistingTrack testDatabase title artist
        else addNewTrack testDatabase title artist

【问题讨论】:

  • 你的 let 语法看起来不对。你需要一个in,不是吗?
  • 您好,欢迎快速回复,我对此一无所知!这是做什么的?
  • This 会是一个很好的阅读。
  • 再次感谢您,实现了一系列 in then else 语句(参见最新的代码段),必须几乎排序为没有解析错误,但得到“无法匹配预期类型 Sale -> Bool with实际类型为“Bool”,错误发生在“True”。从这里修复是否简单?我太累了,无法解决其他问题!
  • addNewTrack 除了返回它的第一个参数之外什么都不做。 incrExistingTrack 除了返回一个空列表之外什么都不做,因为第一个定义完全由无可辩驳的模式组成,所以它将总是匹配任何参数。

标签: parsing haskell if-statement


【解决方案1】:

您提供的 sameTrack 参数太少。应该是sameTrack testDatabase title artist

还要注意trackExists == True 是冗长的。可以只是trackExists

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2011-10-04
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多