W funkcji wyższego rzędu zwiń / zmniejsz, jaka jest nazwa ewentualnego argumentu funkcjonalnego?
Pracuję nad monadyczną tabelaryczną biblioteką przetwarzania, w której wiersze są składane w celu uzyskania prostych analiz (takich jak znalezienie minimalnej, maksymalnej, średniej kolumny). Dlatego szukam solidnej nazwy dla argumentu fold
funkcji i każda nazwa, która jest dobrze ugruntowana w społeczności ML (lub Haskell lub Common Lisp jako drugi i trzeci kandydat) byłaby interesująca.
Nazwa podobna f
jest powszechna w opisie fold
funkcji, jest jednak nieopisowa i rzeczownik lepiej by pasował.
terminology
functional-programming
naming
użytkownik40989
źródło
źródło
fold
jest funkcją wyższego rzędu. Argument do spasowania jest po prostu tym, argumentemOdpowiedzi:
Nie wiem, czy jest na to jakaś odpowiedź, jak wspomniał @jozefg. I tak wyłącznie z powodu spekulacji, oto jedno możliwe wytłumaczenie:
Podejrzewam, że powodem jest to, ponieważ typ -
(a -> b -> b)
w Haskell użytkownikafoldr
, na przykład - jest bardziej sensowne niż jedna nazwa mogłaby wymyślić. Ponieważ parametry typua
ib
mogą być dowolne , funkcja może zrobić prawie wszystko. Więc jesteś w lewo o nazwach takich jakfunction
,combiner
,morphism
, iargument
, które nie są szczególnie znaczące albo. Może także użyć krótkiej, nie rozpraszającej uwagi nazwy.Innym przykładem jest
id :: a -> a
funkcja: jak nazwać jej argument? Ponownie myślęid
, że typ jest bardziej opisowy niż nazwa argumentu.Zgadzam się jednak z tobą - wydaje się, że powinna istnieć wspólna nazwa, być może w matematyce. Mam nadzieję, że ktoś może mnie poprawić.
Kilka przykładów jego nazwy w prawdziwym kodzie:
W bibliotekach Haskella jest to najczęściej nazywane
f
(a czasemoperator
w komentarzach):Jest również nazywany
f
w Clojure :źródło
Nie zgadzam się z ideą, która
f
jest złą nazwą argumentu funkcjifold
. Powodem, dla którego chcemy opisowych nazw w programowaniu jest to, że wiemy, co opisuje nazwa, a nazwaf
jest powszechnie używana w matematyce (i funkcjonalnych językach programowania) dla funkcji (jak sąg
ih
).Nie wiemy prawie nic
f
(z założenia, ponieważ jeśli moglibyśmy być bardziej konkretni, nie moglibyśmy użyćfold
na tak wielu rzeczach), a nazwaf
mówi nam wszystko, co musimy wiedzieć, z wyjątkiem tego, że jest to funkcja dwóch argumentów. Nazwaf
jest bardzo podobna do zaimka „it” w języku angielskim - jest symbolem zastępczym, który może znaczyć prawie wszystko. Nie wiemy, co to jest, dopóki nie użyjemy go w zdaniu, i nie wiemy, co tof
jest, dopóki nie zadzwonimyfold
.Nazywając rzeczy, chcemy uzyskać jak najwięcej informacji z nazwy i wolimy, aby nazwa była krótka (jeśli możemy to uzyskać bez poświęcania ważnych informacji). Tutaj mamy bardzo krótką nazwę, która mówi nam prawie wszystko, co wiemy na ten temat. Nie sądzę, że można to poprawić.
W programowaniu imperatywnym
i
jest używany jako licznik pętli (jak sąj
ik
, jeśli potrzebujemy więcej); w programowaniu funkcjonalnymf
jest używany jako argument funkcji w funkcjach wyższego rzędu (jak sąg
ih
, jeśli potrzebujemy więcej). Nie mam wystarczającego doświadczenia z językami funkcjonalnymi, aby mieć pewność, że konwencja f / g / h jest równie dobrze rozwinięta, jak konwencja i / j / k, ale jeśli tak nie jest, myślę, że powinna (zdecydowanie jest ustanowiony w matematyce).źródło
Najczęstszą nazwą tego, którą słyszałem inną niż zaimek
f
, jestbinary operation
lubbinary function
- problem z byciem bardziej konkretnym niż to, że może zrobić dosłownie wszystko , i dlatego ludzie trzymają się podpisu typua -> b -> a
(luba -> b -> b
jeśli jest to prawidłowa fałda) .Proponuję więc, abyś zrobił to dokładnie, trzymaj się podpisu typu, na szczęście ten podpis określonego typu ma nazwę
binary function
:, podobnie jaka -> a
jestunary operation
ia -> b
jestunary function
, możesz wywołaća -> a -> a
abinary operation
ia -> b -> c
abinary function
.źródło
binary operation
bardziej znaczyłobya -> a -> a
ibinary function
oznaczałobya -> b -> c
… prawda z pewnością leży pomiędzy. :-)Funkcja, o którą prosisz, jest czasami nazywana „funkcją łączącą” (patrz np . Strona HaskellWiki w folderze ), ale nie jest to wystarczająco powszechne, aby nazwać ją standardową terminologią.
źródło