8

In Clojure we have the identity function. It is used as follows:

user=> (filter identity [1 2 3 nil 4 false true 1234])
(1 2 3 4 true 1234)

user=> (partition-by identity (sort "abcdaabccc"))
((\a \a \a) (\b \b) (\c \c \c \c) (\d))

From what I can see in Haskell - id is used when using lenses and is used in other higher order functions.

My question is (apart from the obvious Type system differences) Does the identity function in Clojure have the same usage and purpose as the id function in Haskell?

Why I ask is when I look at the following example of a Lens in Clojure - we see Id defined in terms of functor:

(defprotocol Functor
    (fmap [functor f] "fmap :: f a -> (a -> b) -> f b"))

;; data Id a = Id { runId :: a }
(defrecord Id [runId]
    Functor
   (fmap [functor f]
        (Id. (f (:runId functor)))))

So I feel like I'm missing something.

Community
  • 1
  • 1
hawkeye
  • 34,745
  • 30
  • 150
  • 304

1 Answers1

8

The id function in Haskell is the I combinator of lambda calculus. It is the trival function:

-- | Identity function.
id :: a -> a
id x = x

It is useful the way that 0 or the empty list are useful.

The identity function in Clojure is equivalent in that it returns its argument unmodified.

(defn identity
  "Returns its argument."
  {:added "1.0"
   :static true}
  [x] x)

Other notions of e.g Identity monads and so forth are not directly connected to the id function.

Community
  • 1
  • 1
Don Stewart
  • 137,316
  • 36
  • 365
  • 468