Как отменить созданный список в Haskell?

avatar
user9525655
8 апреля 2018 в 02:48
417
1
0

Мне нужно руководство, как сделать идеальный реверс в моем коде на Haskell. Мой код:

input :: Int -> [Int]
input x = check_1 x
check_1 x = check_2 (case x of
  0 -> []
  x -> check_1 (x`div`10) ++ [x`mod`10])
check_2 x = reverse x

Мой вывод:

Prelude -> input 12345
Prelude -> [5,3,1,2,4]

Как я хочу:

Prelude -> input 12345
Prelude -> [5,4,3,2,1]

Пожалуйста, помогите мне вызвать функцию check_2, это лучший способ перевернуть список. Спасибо

Источник
Elmex80s
8 апреля 2018 в 06:35
0

Когда реверс совершенен?

fp_mora
2 мая 2018 в 22:10
0

Меньше работы может быть reverse [ read [x] :: Int | x <- show 12345]

Ответы (1)

avatar
sepp2k
8 апреля 2018 в 02:56
4

Проблема в том, что вы переворачиваете список после каждого добавленного элемента, так что получается беспорядок. Вы хотите отменить один раз после того, как вы добавили все элементы. Вы можете добиться этого, избавившись от check_2 и изменив input на:

input x = reverse $ check x

Однако лучшим решением в этом случае было бы вообще не реверсировать, а сначала создать список в правильном порядке: Если вы измените

check_1 (x`div`10) ++ [x`mod`10])

до

x `mod` 10 : check_1 (x `div` 10)

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

user9525655
8 апреля 2018 в 03:19
0

Можете ли вы сказать мне, как я могу отправить возвращенный список из check_1 в check_2 после того, как все элементы были добавлены. Я попробовал ваш метод, и он работает, но это не поможет мне в моих будущих проверках.

sepp2k
8 апреля 2018 в 03:27
0

@Aman Поскольку ваш check_2 - это просто reverse, вы можете просто позвонить check_2, где я звоню reverse, и это будет то же самое.

user9525655
8 апреля 2018 в 03:33
0

моя ошибка извините. На самом деле теперь я понимаю, что вы пытались сказать мне в своем ответе, и это мне очень поможет. Спасибо