![](/img/trans.png)
[英]What is the 'pythonic' equivalent to the 'fold' function from functional programming?
[英]What exactly is meant by “partial function” in functional programming?
根據我的理解,部分函數是我們通過向 function 傳遞比預期更少的參數獲得的函數。 例如,如果這在 Python 中直接有效:
>>> def add(x,y):
... return x+y
...
>>> new_function = add(1)
>>> new_function(2)
3
在上面的代碼片段中, new_function
是部分 function。 但是,根據Haskell Wiki ,部分 function 的定義是
部分 function 是一個 function,它沒有為指定類型的所有可能的 arguments 定義。
所以,我的問題是:“部分功能”到底是什么意思?
您在這里混淆了兩個概念。 部分應用function [haskell-wiki]和部分 function [haskell-wiki] 。
部分應用的 function 是:
Haskell 中的部分應用涉及將少於 arguments 的全部數量傳遞給需要多個 ZDBC11CAA5BDA99F77E8FB4EDABD7 的 function。
而部分 function 確實是非全部 function:
部分 function 是一個 function,它沒有為指定類型的所有可能的 arguments 定義。
部分 function(在函數式編程和數學的上下文中)正是 wiki 所說的:function 沒有為所有可能的 arguments 定義。 在編程的上下文中,我們通常將“未定義”解釋為幾件事之一,包括未定義的行為、異常或未終止。
部分 function 的示例是 integer 除法,如果除數為 0,則未定義(在 Haskell 中將引發錯誤)。
在上面的代碼片段中,new_function 是部分 function。
該代碼只會在 Python 中導致錯誤,但如果它按您的預期工作,它將是總的(意思不是部分的)function。
正如評論員已經指出的那樣,您很可能認為它是部分應用的 function。
答案說明了一切,我只會在每種語言中添加一個示例:
def add(x,y):
return x+y
f = add(1)
print(f(3))
f = add(1)
TypeError: add() missing 1 required positional argument: 'y'
這既不是部分function也不是咖喱ZC1C1C425268E68385D174C174C174C174C174F14F14F14F14F14F14F ,這只是ZC1C1C1C425268E68E68E68EMERYOURYOURYOURYOURYOURYOURYOURYOURYOURYOURYOURYOURYOUR您
python 中的咖喱 function 應該是這樣的:
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 中的部分 function:
def first(ls):
return ls[0]
print(first([2,4,5]))
print(first([]))
output
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
那么總的 function 是多少?
好吧,基本上相反:這是一個 function,適用於該類型的任何輸入。 這是 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]
這里的功能不會永遠掛起。 概念是相同的:對於每個列表,function 都可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.