簡體   English   中英

函數式編程中的“部分函數”到底是什么意思?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM