Haskell Данные и объявления типов - PullRequest
0 голосов
/ 19 мая 2018

Велогонка может быть представлена ​​в виде списка велосипедистов.Каждый гонщик записывается со своим классом способностей (Высокий или Низкий), именем и временем в минутах, в которое он финишировал в каждой из своих гонок, в следующих типах:

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, и это один из них.Может кто-нибудь объяснить, пожалуйста, как подойти к таким вопросам?

1 Ответ

0 голосов
/ 19 мая 2018

A RiderResults значение не является списком;это тройка способности, имени и списка раз.Вам нужно сначала распаковать это значение, прежде чем вы сможете суммировать время, сохраненное в значении.

totalTime (Rider ab _ times) = sum (map penalty times)
  where penalty = if ab == Low then id else (*2)
...