Имеет ли функция идентификации в Clojure такое же использование и назначение, что и функция id в Haskell?

В Clojure у нас есть функция identity. Он используется следующим образом:

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))

Из того, что я вижу в Haskell - id используется, когда с помощью линз и используется в других функциях более высокого порядка.

У меня вопрос (помимо очевидных различий в системе типов): Имеет ли функция identity в Clojure такое же использование и назначение, что и функция id в Haskell?

Почему я спрашиваю, так это когда смотрю на следующий пример Lens в Clojure — мы видим, что Id определяется через 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)))))

Поэтому я чувствую, что что-то упускаю.


person hawkeye    schedule 28.09.2014    source источник
comment
Определение Id в clojure эквивалентно функтору Identity в Haskell.   -  person bennofs    schedule 28.09.2014


Ответы (1)


Функция id в Haskell I комбинатор лямбда-исчисления. Это тривиальная функция:

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

Это полезно так же, как полезны 0 или пустой список.

Функция identity в Clojure аналогична в том смысле, что возвращает свой аргумент без изменений.

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

Другие понятия, например, Identity монады и т. д. не связаны напрямую с функцией id.

person Don Stewart    schedule 28.09.2014