Haskell: вызов функции для каждого списка из кортежа - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь решить одну из проблем HackerRank, Кошки и мышь , используя Haskell.

Я реализовал логику c для решения проблемы , хотя сталкивается с некоторыми проблемами при получении ввода и разбора до нужной формы.

Код:

solve :: [Int] -> String
solve input
    | catA == catB = "Mouse C"
    | catA > catB  = "Cat B"
    | otherwise    = "Cat A"
    where catA = abs $ input !! 0 - input !! 2
          catB = abs $ input !! 1 - input !! 2

main = interact $ unlines . map solve . splitAt 3 . map read . tail . words

Я знаю, что функция splitAt возвращает кортеж. Поэтому мне нужна помощь в разборе кортежа здесь.

Мне нужно вызвать функцию решения для каждого списка, присутствующего в кортеже, и добавить результат к выводу.

Может кто-нибудь помочь мне решить эту проблему?

Ответы [ 2 ]

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

Один простой способ сделать это - просто заменить map solve простой анонимной функцией:

main = interact $ unlines . (\(a, b) -> [solve a, solve b]) . splitAt 3 . map read . tail . words

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

0 голосов
/ 14 апреля 2020

Вы не хотите splitAt 3, вы хотите Data.List.Split.chunksOf 3. Если у вас нет Data.List.Split, доступного на хакерранке, вам нужно переопределить куски тем или иным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...