2014-01-30 2 views
1

Я изучаю функциональное программирование с использованием языка SML. Читая мои заметки о работе, я столкнулся с вопросом, который спрашивает, какая функция (перевернутая или карри) выполняется быстрее.Функция Tuppled по сравнению с точной функцией в SML/NJ

Я посмотрел видео here, где инструктор говорит, что это вопрос языковой реализации и состояния (в 5:25), что SML/NJ выполняет быстрее с использованием функций, но не указывает, почему является.

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

Может кто-нибудь, пожалуйста, уточните это?

ответ

1

Есть еще одна промежуточная оценка для точных функций. Предположим, нам нужна функция, поэтому суммируйте три числа. Рассмотрим следующие два определения:

fun sum (x,y,z) = x + y + z 

В качестве альтернативы,

fun sum x y z = x + y + z 

Рассмотрим следующий грубый след оценки на первой версии:

:> sum(1,2,3) 
    1 + 2 + 3 (substitution using pattern matching on the contents of the tuple) 
    (1 + 2) + 3 
    3 + 3 
    6 

С другой стороны, с выделанной версии SML будет строить некоторые анонимные функции «на лету», поскольку оценивает это выражение. Это связано с тем, что функции curried используют тот факт, что анонимные функции могут быть возвращены как результаты других функций, чтобы зафиксировать поведение применения нескольких аргументов к одной функции. Построение функций занимает некоторое постоянное время.

:> sum 1 2 3 
    ((sum 1) 2) 3 
    (((fn x => (fn y => (fn z => x + y + z))) 1) 2) 3 
    ((fn y => (fn z => 1 + y + z)) 2) 3 
    (fn z => 1 + 2 + z) 3 
    1 + 2 + 3 
    (1 + 2) + 3 
    3 + 3 
    6 

Так что есть несколько дополнительных шагов. Однако, конечно, это не должно вызывать проблем с производительностью в вашей программе.

Смежные вопросы