自行车比赛可以表示为自行车骑手名单。每个骑手都会记录他们的能力等级(高或低),名字以及他们在每场比赛中完成的时间(以分钟为单位),具体如下:
data Ability = High | Low
data RiderResults = Rider Ability String [Int]
type Championship = [RiderResults]
如何解决totalTime :: RiderResults - > Int返回该骑手在其所有比赛中所花费的总时间,包括任何罚分。高能力骑手因实际时间加倍而受到惩罚(例如,罚前总时间70分钟变为140分钟)。
我做过像
这样的事情 totalTime :: RiderResults -> Int
totalTime (x:xs) = if x == Low then sum x*2
else x : totalTime xs
但这是错误的。我有解决Haskell中的类型定义和数据声明的练习题,这就是其中之一。有人可以解释如何处理这些问题吗?
答案 0 :(得分:5)
RiderResults
值不是列表;它是能力,名称和时间列表的三倍。在总结存储在值中的时间之前,您需要首先解压缩该值。
totalTime (Rider ab _ times) = sum (map penalty times)
where penalty = if ab == Low then id else (*2)