2014-09-28 5 views
6

В Clojure у нас есть функция identity. Он is used as follows:Имеет ли функция идентификации в Clojure одинаковое использование и назначение, как функция id в Haskell?

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 - idis used when using lenses и used in other higher order functions.

Мой вопрос (помимо очевидных различий Тип системы) ли identity функции в Clojure имеют одинаковое использование и назначение в качестве id функции в Haskell?

Почему я спрашиваю, когда я смотрю на the following example из в Lens in 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))))) 

Так что я чувствую, что я что-то не хватает.

+2

Определение 'Id' в clojure равно функции' Identity' в Haskell. – bennofs

ответ

6

Функция id в Haskell - это I combinator of lambda calculus. Это тривиальная функция:

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

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

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

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

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