Что именно означает «частичная функция» в функциональном программировании?

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

>>> def add(x,y):
...    return x+y
... 
>>> new_function = add(1)
>>> new_function(2)
3

В приведенном выше фрагменте, new_function является частичной функцией. Однако, согласно Haskell Wiki , определение частичной функции является

. Частичная функция - это функция, которая не определена для всех возможных аргументов указанного типа.

Итак, мой вопрос: что именно подразумевается под «частичной функцией»?

54
задан wjandrea 11 October 2019 в 16:19
поделиться

3 ответа

Вы здесь путаете два понятия. частично применялся функция [haskell-wiki] с частичная функция [haskell-wiki] .

А частично применялся , функция:

Частичное приложение в Haskell включает передача меньше, чем полное количество аргументов к функции, которая берет несколько аргументов.

, тогда как частичная функция действительно является необщей функцией:

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

73
ответ дан 7 November 2019 в 07:55
поделиться

Ответы объясняют все, я просто добавлю один пример на каждом языке:

def add(x,y):
    return x+y

f = add(1)
print(f(3))

    f = add(1)
TypeError: add() missing 1 required positional argument: 'y'

это не ни частичная функция, ни функция с приправой карри , это - только функция, которую Вы не сделали дал все ее аргументы .

А приправленная карри функция в Python должна быть похожей на это:

partialAdd= lambda x: lambda y: x + y

plusOne = partialAdd(1)
print(plusOne(3))

4

и в haskell:

plus :: Int -> Int -> Int
plus x y = x + y

plusOne = plus 1

plusOne 4

5

А частичная функция в Python:

def first(ls):
    return ls[0]

print(first([2,4,5]))
print(first([]))

производит

2

print(first([]))
  File "main.py", line 2, in first
    return ls[0]
IndexError: list index out of range

И в Haskell, как Ваш , ссылка обнаружилась:

head [1,2,3]
3

head []
*** Exception: Prelude.head: empty list

Поэтому, что такое общая функция?

ну, в основном противоположное: это - функция, которая будет работать на любой вход того типа. Вот пример в Python:

def addElem(xs, x):
  xs.append(x)
  return xs

и это работает даже на бесконечные списки при использовании небольшого приема:

def infiniList():
    count = 0
    ls = []
    while True:
        yield ls
        count += 1
        ls.append(count)

ls = infiniList()
for i in range(5):
  rs = next(ls)

print(rs, addElem(rs,6))

[1, 2, 3, 4]
[1, 2, 3, 4, 5] [1, 2, 3, 4, 5]

И эквивалент в Haskell:

addElem :: a -> [a] -> [a]
addElem x xs = x : xs

addElem 3 (take 10 [1..])
=> [3,1,2,3,4,5,6,7,8,9,10]

Здесь функции не зависает навсегда. Понятие является тем же: для каждого списка будет работать функция.

16
ответ дан 7 November 2019 в 07:55
поделиться

Частичная функция (и в контексте функционального программирования и в математике) точно, что говорит Wiki: функция, не определенная для всех ее возможных аргументов. В контексте программирования мы обычно интерпретируем "не определенный" как одна из нескольких вещей, включая неопределенное поведение, исключения или незавершение.

примером частичной функции было бы целочисленное деление, которое не определяется, если делитель будет 0 (в Haskell, то это бросит ошибку).

в вышеупомянутом отрывке new_function является частичной функцией.

, Что код просто вызвал бы ошибку в Python, но если бы это работало, поскольку Вы предназначили, это было бы общее количество (значение не неравнодушный) функция.

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

20
ответ дан 7 November 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: