SML карри вопрос - PullRequest
       26

SML карри вопрос

1 голос
/ 09 февраля 2011

У меня на следующей неделе будет среднесрочный период, и я просто перебираю заметки sml, представленные в классе.Я наткнулся на пример с карри и не знал точно, как он работает.

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

fun pow 0 n = 1 | pow k n = n*pow(k-1)n

Я не уверен, как эта функция работает, когда мы передаем ей следующие аргументы:

val x = pow 2 2

Вот как я ее вижу:

=2*pow(1)2
=2*(2*pow(0)2)2
=2*(2*(1)2)2) 

Результат, который мы должны получить, равен четырем, но я не понимаю, как мы получаем этот результат из шагов, которые я выполнил выше.

Помощь Пожалуйста.Благодарственные.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

Ах, стандартный ML Нью-Джерси, как я скучаю по тебе ...

В любом случае, позвольте мне пройти этот шаг за шагом.Помните, что карри, в отличие от ужина передо мной (который, кстати, является блюдом с карри), - это в основном способ иметь дело только с одним аргументом за раз, чтобы вернуть новую функцию.Имея это в виду, примените первые 2 к данной функции.Поскольку соответствует только один шаблон, теперь у вас есть новая функция - давайте назовем ее «curry»:

curry n = n * pow 1 n

Обратите внимание, что теперь у вас есть «внутренняя» версия функции pow для адресации.При этом, опять же, один шаблон соответствует.Давайте назовем эту внутреннюю карри функцию «рис»:

rice n = n * pow 0 n

И еще один, «креветка» - но на этот раз другой шаблон соответствует:

shrimp n = 1

Рекурсия завершеназдесь, так что у вас есть:

rice n = n * 1
curry n = n * (n * 1)

Теперь, используйте вторые 2 в вашем исходном pow 2 2 с новой функцией curry:

curry 2 = 2 * (2 * 1)

, что, конечно, равно 4.

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

1 голос
/ 09 февраля 2011
2*pow(1)2 =2*(2*pow(0)2)2 

Здесь вы расширяете pow 1 до 2 * pow 0 2 и оставляете 2 после него. Это не верно. pow 1 само по себе расширится до (fn n => n * pow 0 2), только при применении его ко второму аргументу оно также станет 2 * pow 0 2. Поэтому выше следует читать:

2*pow(1)2 =2*(2*pow(0)2)

Теперь, если мы применим pow 0 2, мы получим 1, так что конечный результат:

2*pow(1)2 = 2*(2*pow(0)2) = 2*(2*1) = 4
...