¿Es addVat una función pura?
function addVat(country, getVat, amount) { if(amount > 0) { return amount + getVat(country)*amount } return amount }Tener una función como parámetro - getVat - ¿hace que addVat sea automáticamente impuro?
Dependiendo de la implementación de getVat, podríamos introducir efectos secundarios... getVat podría devolver un valor aleatorio haciendo impredecible el resultado de addVat.
const getVat = ()=> Math.random() addVat('UK',getVat, 20)Caso de producir efectos secundarios externos...
const getVat = ()=> { updateDbWithVatUsed(0.2) return 0.2 } addVat('UK',getVat, 20)Por otro lado, la prueba unitaria es factible ya que los efectos secundarios o la variabilidad de los datos están fuera de la función pura y podemos bloquear esto para que la prueba sea totalmente predecible.
const getUKVat = ()=> 0.2 assert.equal(addVat('UK',getUkVat, 20), 24)Mis dudas vienen de... ¿la pureza se define como lo que hace la función excluyendo todo lo que sucede con una llamada externa que se ha pasado como parámetro?
De lo contrario, dado que la función de alto orden es un tema para la programación funcional... ¿no hace que sea imposible clasificar una función como pura por sí misma sin tener en cuenta las consideraciones de invocación?
Creo que depende de getVat() . Si getVat() es puro addVat() también es puro :)