Нормализация функций без фактического применения в Haskell - PullRequest
6 голосов
/ 01 мая 2020

Я бы хотел оценить функцию в ее обычной форме, не применяя ее, например,

\n -> n + sum [1..100]

должен быть оценен как

\n -> n + 5050

Но нет экземпляра NFData для функций, что разумно, поскольку мы не можем получить подтермы функции.

Мне интересно, возможно ли полностью нормализовать функцию с помощью некоторого компилятора magi c.

1 Ответ

5 голосов
/ 01 мая 2020

Нет, это невозможно. Однако в большинстве случаев это не нужно. Я подозреваю, что трюк, который вы пропустили, это снятие дорогих вычислений, которые не зависят от вывода через let. Сравните:

-- recomputes `sum [1..100]` each time you apply it to an argument
f1 :: Int -> Int
f1 n = n + sum [1..100]

-- computes `sum [1..100]` just once, then uses the "cached" result each time
-- you apply it to an argument
f2 :: Int -> Int
f2 = let s = sum [1..100] in \n -> n + s

Функция f1 стоит дорого каждый раз, когда вы ее используете. Функция f2 стоит дорого в первый раз, когда вы ее используете, но дешево каждый раз после этого.

(Этот ответ указывается от c до GH C. Другие компиляторы, если они существуют, могут вести себя по-другому.)

...