Я очень новичок в Haskell
data Recipes = Recipes Int Int Int [Int] deriving(Show)
addRecipes :: Recipes -> Recipes
addRecipes (Recipes t e1 e2 list) =
let (e1c, e2c) = (list !! e1, list !! e2)
newVal = e1c + e2c
newList = list ++ (digits $ newVal)
e1n = calcNewPos e1 e1c newList
e2n = calcNewPos e2 e2c newList
in Recipes t e1n e2n newList
calcNewPos :: Int -> Int -> [Int] -> Int
calcNewPos i i2 list = (i + i2 + 1) `mod` (length list)
-- Borrowed:
-- https://stackoverflow.com/questions/3963269/split-a-number-into-its-digits-with-haskell
digits :: Int -> [Int]
digits = map (read . (:[])) . show
Приведенный выше фрагмент кода является частью рекурсии, которую я пропустил. addRecipes
вызывается снова и снова в рекурсивном вызове. Это решение проблемы появления кода (AoC 2018, день 14). Код дает правильный результат, но ужасно медленный.
Я просто пытаюсь понять, в чем проблема, что ужасно неэффективно в приведенном выше коде?
Я попытался оптимизировать ++
-оператор и заменить его на :
и комбинировать вещи с цифровым вызовом. Я знаю, что ++
медленнее, чем :
, но так ли это? (Помните, я изучаю Haskell, поэтому я хочу исправить этот код, если это возможно, и знаю, почему я не могу написать его так)
Редактировать: список в рецептах растет и становится большим
list !! n
или добавлениеlist ++ something
, базовый список не является подходящей структурой данных. Трудно подсказать, что использовать, не понимая общей картины. Возможно, достаточно массива или нужныSeq
/Vector
. Может быть, можно обойтись и без случайного доступа, и тогда со списками все в порядке. - person chi   schedule 16.12.2018!!
, может быть, я смогу как-то удалить его. - person Adam   schedule 16.12.2018Seq
будет намного проще. - person David Fletcher   schedule 16.12.2018Seq
относится к hackage .haskell.org/package/containers-0.6.0.1/docs/ - person Paul Johnson   schedule 16.12.2018Seq.take 6 (Seq.reverse seq) == part2Input = Seq.length seq - 5
. Я сам отвечу, но если у вас есть указания на это последнее препятствие, я возьму их! :) - person Adam   schedule 16.12.2018