Насколько я понимаю, частичные функции - это функции, которые мы получаем, передавая в функцию меньше параметров, чем ожидалось. Например, если это было правильно в Python:
>>> def add(x,y):
... return x+y
...
>>> new_function = add(1)
>>> new_function(2)
3
В приведенном выше фрагменте, new_function
это частичная функция. Однако, согласно Haskell Wiki , определение частичной функции
Частичная функция - это функция, которая не определена для всех возможных аргументов указанного типа.
Итак, мой вопрос: что именно подразумевается под «частичной функцией»?
partial
выполняет частичное применение , тогда как Haskell делает это автоматически. Запись в вики относится к частичным функциям , что является термином из математики.add 3 5
не является единственным приложением функции. Это сначала относитсяadd
к 3, чтобы получить новую функцию, которая затем применяется к 5.partial
метод является предварительным объявлением необязательно реализованного частного метода в другом месте кодовой базы проекта.new_function = functools.partial(add, 1)
Ответы:
Вы здесь путаете две концепции. Частично применяются функция [Haskell-вика] с частичной функцией [Haskell-вика] .
Частично примененная функция:
тогда как частичная функция действительно является неполной функцией:
источник
Частичная функция (как в контексте функционального программирования, так и математики) - это именно то, что говорит вики: функция, не определенная для всех возможных аргументов. В контексте программирования мы обычно интерпретируем «не определено» как одну из нескольких вещей, включая неопределенное поведение, исключения или отсутствие завершения.
Примером частичной функции может служить целочисленное деление, которое не определяется, если делитель равен 0 (в Хаскеле это приведет к ошибке).
Этот код просто вызвал бы ошибку в Python, но если бы он работал так, как вы хотели, это была бы полная (то есть не частичная) функция.
Как уже отмечали комментаторы, вы, скорее всего, думаете о том, что это будет частично примененная функция.
источник
Ответы объясняют все, я просто добавлю один пример на каждом языке:
это не частичная функция и не функция карри , это только функция, которую вы не предоставили всем своим аргументам .
Функция карри в Python должна быть такой:
и в хаскеле:
Частичная функция в Python:
А в Хаскеле, как показала твоя ссылка :
Ну, в основном наоборот: это функция, которая будет работать для любого ввода этого типа. Вот пример в Python:
и это работает даже для бесконечных списков, если вы используете небольшой трюк:
И эквивалент в Haskell:
Здесь функции не зависают вечно. Концепция одинакова: для каждого списка функция будет работать.
источник