What exactly is meant by "partial function" in functional programming? What exactly is meant by "partial function" in functional programming? python python

What exactly is meant by "partial function" in functional programming?


You are here confusing two concepts. A partially applied function [haskell-wiki] with a partial function [haskell-wiki].

A partially applied function is:

Partial application in Haskell involves passing less than the full number of arguments to a function that takes multiple arguments.

whereas a partial function indeed is a non-total function:

A partial function is a function that is not defined for all possible arguments of the specified type.


A partial function (both in the context of functional programming and mathematics) is exactly what the wiki says: a function not defined for all of its possible arguments. In the context of programming, we usually interpret "not defined" as one of several things, including undefined behaviour, exceptions or non-termination.

An example of a partial function would be integer division, which is not defined if the divisor is 0 (in Haskell it will throw an error).

in above snippet new_function is partial function.

That code would simply cause an error in Python, but if it worked as you intended, it would be a total (meaning not partial) function.

As commentors already pointed out, you're most likely thinking of the fact that it'd be a partially applied function.


The answers explain all, I will just add one example in each language:

def add(x,y):    return x+yf = add(1)print(f(3))    f = add(1)TypeError: add() missing 1 required positional argument: 'y'

this is neither a partial function nor a curried function, this is only a function that you didn't gave all its arguments.

A curried function in python should be like this:

partialAdd= lambda x: lambda y: x + yplusOne = partialAdd(1)print(plusOne(3))4

and in haskell:

plus :: Int -> Int -> Intplus x y = x + yplusOne = plus 1plusOne 45

A partial function in python:

def first(ls):    return ls[0]print(first([2,4,5]))print(first([]))

output

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

And in Haskell, as your link showed up:

head [1,2,3]3head []*** Exception: Prelude.head: empty list

So what is a total function?

Well, basically the opposite: this is a function that will work for any input of that type. Here is an example in python:

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

and this works even for infinite lists, if you use a little trick:

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]

And the equivalent in Haskell:

addElem :: a -> [a] -> [a]addElem x xs = x : xsaddElem 3 (take 10 [1..])=> [3,1,2,3,4,5,6,7,8,9,10]

Here the functions doesn't hang forever. The concept is the same: for every list the function will work.