答えはすべてを説明しています、私は各言語で1つの例を追加します:
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]
ここで、関数は永久にハングしません。概念は同じです。すべてのリストで関数が機能します。