← Back to context

Comment by StavrosK

7 years ago

I dispute your example. If you call f(2) and it always returns 4, it's idempotent and side-effect-free. If you call f() and it returns 4, then 8, etc, it is neither.

From wikipedia:

"A unary operation f, that is, a map from some set S into itself, is called idempotent if, for all x in S, f(f(x)) = f(x)."

  • Instead of checking wikipedia for a general definition of idempotency, check the RFC for the definition that applies to HTTP

    9.1.2 Idempotent Methods

       Methods can also have the property of "idempotence" in that (aside
       from error or expiration issues) the side-effects of N > 0 identical
       requests is the same as for a single request.

  • Yes, in mathematics, not programming. And a function that doubles a number isn't idempotent even by that definition.

    • Of course a doubling function is not idempotent!

      I think the confusion arises because side-effectful functions can be considered as having type

          f :: (RealWorld, OtherArgs) -> (RealWorld, OtherOutputs)
      

      and so for a garage door toggle you have something like

          t :: RealWorld -> RealWorld
      

      where the new state is the old one with the door opened/closed as appropriate.

      Now the idempotence condition becomes:

          t(t(world)) == t(world)
      

      but clearly

             t(t(doorOpenWorld)
          =  t(doorClosedWorld)
          =  doorOpenWorld
          != t(doorOpenWorld)
          =  doorclosedWorld
      

      so this is where the notion comes from. If you abuse notation and just say a function of no arguments can be idempotent then you'll get confusion like this.

      5 replies →

  • I think because in math you don’t ever have side effects you usually use composition where in programming you usually use a sequence. So to change that function in to how people would implement it means rearranging the internal stuff and then it probably wouldn’t be idempotent be either definition.