Скажите, что у вас есть очень детерминированный алгоритм, который создает список, например inits
в Data.List
. Есть ли способ, которым компилятор Haskell может оптимально выполнить операцию «индексации» по этому алгоритму без фактического генерирования всех промежуточных результатов?Оптимизировать индексирование «списка» в Haskell
Например, inits [1..] !! 10000
довольно медленно. Может ли компилятор каким-то образом вывести то, что inits
будет производить на 10000-м элементе без какой-либо рекурсии и т. Д.? Конечно, эту же идею можно было бы обобщить за пределами списков.
Редактировать: В то время как inits [1..] !! 10000
является постоянным, мне интересно о какой-либо «индексной» операции над некоторым алгоритмом. Например, можно было бы оптимизировать \i -> inits [1..] !! i
таким образом, чтобы не было рекурсии [или минимальной] для достижения результата для любого i
?
Ну, технически он мог оценить это выражение во время компиляции. В некоторых конкретных случаях «достаточно умный компилятор» может найти закрытое выражение формы. Но в целом, я думаю, это невозможно, не говоря уже о возможно. Я оставлю проблему с остановкой для кого-то еще :-) – delnan
Возможный дубликат [Почему (константные) выражения не оцениваются во время компиляции в Haskell?] (Http://stackoverflow.com/questions/19259114/why -are-constant-expressions-not-evaluation-at-compile-time-in-haskell) – phs
[This] (http://stackoverflow.com/a/19260999/580412) может быть просветляющим. – phs