Вычисление работы, выполняемой функцией f x = (x, x)

Скажем, у меня есть эта функция: (синтаксис Haskell)

f x = (x,x)

Какова работа (количество вычислений), выполняемая функцией?

Сначала я думал, что он явно постоянен, но что, если тип x не является конечным, то есть x может принимать произвольный объем памяти? Можно было бы также учитывать работу, выполненную путем копирования x, правильно?

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

Это не домашнее задание для себя, но появилось, когда я должен был определить работу, выполняемую функцией:

f x = [x]

У меня такая же проблема.

Ответы

Ответ 1

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

  • наведите указатели на x в стеке
  • выделить ячейку кучи для (,)
  • применить (,) к своим аргументам
  • возвращает указатель на ячейку кучи

Готово. O (1) работает, когда вызывающий объект смотрит на результат f.

Теперь вы начнете дальнейшую оценку, если заглянете внутрь (,), и эта работа зависит от работы, чтобы оценить x. Поскольку в Haskell ссылки на x являются общими, вы оцениваете их только один раз.

Итак, работа в Haskell - это O (работа x), если вы полностью оцениваете результат. Ваша функция f добавляет только постоянные факторы.

Ответ 2

У Криса Окасаки есть замечательный метод определения работы, взимаемой с вызова функции, когда вводится какая-то (или общая) лень. Я считаю, что это в его статье "Чисто функциональные структуры данных". Я знаю, что это в книжной версии - я прочитал эту часть книги в прошлом месяце. В основном вы берете постоянный коэффициент для созданного обещания /thunk, ничего не платите за оценку любого переданного в promises/thunks (предположим, что они уже были принудительно/находятся в нормальной форме [а не только WHNF]). Это недооценивается. Если вы хотите завысить плату, также стоимость форсирования/преобразования в обычную форму каждого обещания /thunk, созданного функцией. По крайней мере, это то, как я помню это в моем чрезвычайно усталом состоянии.

Посмотрите в Окасаки: http://www.westpoint.edu/eecs/SitePages/Chris%20Okasaki.aspx#thesis - Клянусь, что тезис, который будет использоваться, будет доступен для загрузки.