как обновить данные в нескольких списках Haskell - PullRequest
0 голосов
/ 21 апреля 2020

. обновить данные с учетом списка самых последних цифр миль, удалив самые старые цифры миль для каждого места

data People= People{ person:: String, age:: Int, weigth:: Float, miles:: [Float]} 

testData :: [People]
testData = [ person "sara"       19  50   [ 5, 8, 8],
          person "ed"      50  60   [0 , 1, 2],
          person "norman"      25   75     [ 2, 3 ,5]]

Я пытаюсь убрать все последние цифры и добавить новые цифры в каждый список, указанный [ 2,1,5] , поэтому я буду иметь [ [2,5,8], [1,0,1], [5,2,3] ] в качестве новых миль для каждый человек

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Итак, в основном вы можете сделать следующее:

data People = People { person :: String
                     , age    :: Int
                     , weight :: Float
                     , miles  :: [Float]
                     } deriving (Show)

testData :: [People]
testData = [ People "sara"   19 50 [5,8,8]
           , People "ed"     50 60 [0,1,2]
           , People "norman" 25 75 [2,3,5]
           ]

addMiles :: [People] -> [Float] -> [People]
addMiles ps ms = zipWith f ps ms
                 where
                 f p m = p {miles = m : init (miles p)}

или вы можете сделать как

addMiles :: [People] -> [Float] -> [People]
addMiles = zipWith (\p m -> p {miles = m : init (miles p)})

Тогда;

addMiles testData [2,1,5]
[ People {person = "sara", age = 19, weight = 50.0, miles = [2.0,5.0,8.0]}
, People {person = "ed", age = 50, weight = 60.0, miles = [1.0,0.0,1.0]}
, People {person = "norman", age = 25, weight = 75.0, miles = [5.0,2.0,3.0]}
]
1 голос
/ 21 апреля 2020

Вы можете использовать zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]. Он использует вспомогательную функцию для объединения двух списков.

Сначала необходимо определить этот помощник, который принимает People и Float и возвращает обновленный People, например,

update :: Float -> People -> People
update n people = people { miles = newMiles }
   where newMiles = n : init (miles people)

Это можно использовать с zipWith следующим образом:

zipWith update [2, 1, 5] testData

Обратите внимание, что ваше определение testData неверно. Вы должны использовать конструктор данных People, например:

testData :: [People]
testData = [ People "sara" 19 50 [5, 8, 8]
           -- etc.
           ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...