Este grupo de trabajo ha estado horas buscando la resolución a tus preguntas, te regalamos la soluciones por eso esperamos serte de gran apoyo.
Solución:
Estás aquí confundiendo dos conceptos. A parcialmente aplicado función [haskell-wiki] con un función parcial [haskell-wiki].
parcialmente aplicado función es:
La aplicación parcial en Haskell implica pasando menos que el número total de argumentos a una función que toma múltiples argumentos.
mientras que una función parcial de hecho es una función no total:
Una función parcial es una función que no está definida para todos los argumentos posibles del tipo especificado.
Una función parcial (tanto en el contexto de la programación funcional como de las matemáticas) es exactamente lo que dice el wiki: una función no definida para todos sus posibles argumentos. En el contexto de la programación, generalmente interpretamos “no definido” como una de varias cosas, incluido el comportamiento indefinido, las excepciones o la no terminación.
Un ejemplo de función parcial sería la división de enteros, que no está definida si el divisor es 0 (en Haskell arrojará un error).
en el fragmento anterior new_function es una función parcial.
Ese código simplemente causaría un error en Python, pero si funcionaba como pretendías, sería una función total (es decir, no parcial).
Como ya señalaron los comentaristas, lo más probable es que esté pensando en el hecho de que sería un aplicado parcialmente función.
Las respuestas explican todo, solo agregaré un ejemplo en cada idioma:
def add(x,y):
return x+y
f = add(1)
print(f(3))
f = add(1)
TypeError: add() missing 1 required positional argument: 'y'
esto es ni una función parcial ni una función curryesta es solo una función que usted no dio todos sus argumentos.
Una función curry en python debería ser así:
partialAdd= lambda x: lambda y: x + y
plusOne = partialAdd(1)
print(plusOne(3))
4
y en haskell:
plus :: Int -> Int -> Int
plus x y = x + y
plusOne = plus 1
plusOne 4
5
Una función parcial en python:
def first(ls):
return ls[0]
print(first([2,4,5]))
print(first([]))
producción
2
print(first([]))
File "main.py", line 2, in first
return ls[0]
IndexError: list index out of range
Y en Haskell, como apareció su enlace:
head [1,2,3]
3
head []
*** Exception: Prelude.head: empty list
Entonces, ¿qué es una función total?
Bueno, básicamente lo contrario: esta es una función que funcionará para cualquier entrada de ese tipo. Aquí hay un ejemplo en python:
def addElem(xs, x):
xs.append(x)
return xs
y esto funciona incluso para listas infinitas, si usas un pequeño truco:
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]
Y el equivalente en 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]
Aquí las funciones no cuelgan para siempre. El concepto es el mismo: para cada lista funcionará la función.
Puedes corroborar nuestra tarea añadiendo un comentario y puntuándolo te estamos eternamente agradecidos.