jestem zadowolony z koncepcją pure function
na bardzo prostych przykładów, jak ...Dlaczego ta implementacja czystej funkcji nie jest uważana za mającą zewnętrzne zależności?
function addTwo(val){
return val + 2;
}
Biorąc pod uwagę te same argumenty, że daje te same wyniki, co prowadzi do referencyjna Przejrzystość i dobrego kodu deterministycznego.
Ale wtedy ja natknąłem przykładów jak te (zaczerpnięte z professor frisby mostly adequate guide, ale znalazłem podobne przykłady na innych książek FP JS)
//pure
var signUp = function(Db, Email, attrs) {
return function() {
var user = saveUser(Db, attrs);
welcomeUser(Email, user);
};
};
var saveUser = function(Db, attrs) {
...
};
var welcomeUser = function(Email, user) {
...
};
a ja nie rozumiem, dlaczego nie jest uważane zewnętrzna zależność (tak, nieczysta) od połączenia z saveUser
lub welcomeUser
.
Wiem, że z punktu widzenia funkcji/IO, signUp
zawsze zwraca "taką samą" (odpowiednik) funkcję przewodową, ale wydaje mi się to dziwne.
Trudno mi zrozumieć, dlaczego nawet
function multiplyBy(times){
return value => value * times;
}
const fiveTimes = multiplyBy(5);
fiveTimes(10);
jest uważany pure
. Z zwróconej funkcji POV, dostęp do times
jest odnośnikiem w łańcuchu zasięgu, może pochodzić z najbliższego zewnętrznego zasięgu lub z zewnątrz (jak globalny zasięg).
Ktoś chce przynieść trochę światła?
W jaki sposób "czasy" mogą pochodzić spoza najbliższego zewnętrznego zakresu? –
Załóżmy, że były to 'const multiply = ...' (ES2015). Czy nadal masz pytanie, czy 'fiveTimes' jest czysty? JavaScript nie jest przede wszystkim językiem funkcjonalnym (chociaż może być w większości używany w ten sposób), więc jeśli zmienność tych identyfikatorów jest tym, co Cię niepokoi, odpowiedź może być "zgodnie z konwencją, dopóki nie będziemy mogli użyć ES2015, zakładamy, że opuścisz funkcję identyfikatory niezmienione. " –
@ squint w moim snippet nie jest inny sposób, ale co próbuję powiedzieć (nie jestem native speakerem języka angielskiego) jest to, że jeśli wziąć zwróconą funkcję w izolacji i zbadać ciało (wartość * razy) razy nie występuje w podpisie, więc pobiera z zakresu poprzez wyszukiwanie w łańcuchu zasięgu. Dlatego wydaje się dość nieczyste. – sminutoli