Проблемы с функциями Curry (SML/NJ)

Часто нас интересует вычисление f(i) i=m n∑ , суммы значений функции f(i) для i = m через n. Определите «сигму f m n», которая вычисляет f(i) i=m n∑ . Это отличается от определения «сигма (f, m, n)».

Мне нужно написать Карри-версию этой функции. У меня есть небольшие проблемы с пониманием того, как это будет работать на самом деле. Я понимаю, что функция Карри — это то, что принимает функцию и создает функцию. Будет ли это примером функции карри?

fun myCurry f x = f(x)

Что касается настройки моей проблемы, будет ли это приемлемым началом?

fun sigma f m n =

Я не продвинулся дальше, потому что не могу понять, что меня просят сделать.


person user2796815    schedule 24.09.2013    source источник


Ответы (1)


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

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

Например, с вашим вопросом о сигме,

fun sigma (f,m,n) = ...

не является каррированной функцией, так как принимает только один аргумент (кортеж (f,m,n).)

fun sigma f m n = ...

, однако, это каррированная функция, так как она принимает три аргумента, и допустимо сказать что-то вроде

val sigmasquare = sigma (fn x => x * x)

, частично применив сигму, передав ей первый аргумент.

Более простым примером будет

fun add (x,y) = x + y

Это некаррированная функция. Чтобы оценить его, вы должны указать его аргумент, который включает в себя как x, так и y. add (3,5) в этом случае будет равно 8.

fun add x y = x + y

является каррированной версией этой же функции. Это можно частично оценить, просто присвоив ему x. Например, add 3 будет оцениваться как функция, которая добавит три к своему аргументу.

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

Первый эквивалентен fn (x,y) => x + y, который явно принимает два целых числа и оценивается как целое число.

Второй эквивалентен fn x => fn y => x + y, который принимает целое число и возвращает функцию, принимающую другое целое число и возвращающую целое число.

Таким образом, тип первого — (int * int) -> int, а тип второго — int -> int -> int.

Надеюсь, это немного прояснит карри.

person qaphla    schedule 24.09.2013
comment
Я до сих пор не понимаю, как бы я применил это к моей проблеме. Мне нужно создать несколько функций? - person user2796815; 24.09.2013
comment
Да, сопоставление с образцом в каррированных функциях может выполняться точно так же, как и в некаррированных функциях. (Кроме того, обратите внимание, что они называются карри-функциями, а не карри-функциями). - person qaphla; 24.09.2013
comment
@qaphla Как мне явно указать типы для вашего примера fun add x y. Например, я хочу, чтобы x и y были реальными, и в функции я их округляю перед суммированием, а функция add возвращает целое число. - person Old Geezer; 04.10.2015
comment
Привет, вы можете сделать это, указав, что результат функции будет реальным. Например: add x y : real = x + y; - person Ram G Athreya; 04.05.2017