2014-09-28 10 views
6

In Clojure abbiamo la funzione identity. E 'is used as follows:La funzione di identità in Clojure ha lo stesso uso e lo stesso scopo della funzione id in 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)) 

Da quello che posso vedere in Haskell - idis used when using lenses ed è used in other higher order functions.

La mia domanda è (a parte le ovvie differenze di sistema Type) funziona il identity in Clojure hanno lo stesso uso e scopo come la funzione id in Haskell?

Perché mi chiedo è quando guardo the following example di un Lens in Clojure - vediamo Id definito in termini di 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))))) 

quindi mi sento come mi manca qualcosa.

+2

La definizione di 'Id' in clojure è uguale al funcector 'Identity' in Haskell. – bennofs

risposta

6

La funzione id in Haskell è I combinator of lambda calculus. È la funzione trival:

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

è useful il modo in cui 0 o la lista vuota sono utili.

La funzione identity in Clojure è equivalente in quanto restituisce il suo argomento non modificato.

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

Altri nozioni di per esempio Identity monads e così via non sono direttamente collegati alla funzione id.

Problemi correlati