2014-09-28 12 views
6

In Clojure haben wir die identity Funktion. Es is used as follows:Funktioniert die Identitätsfunktion in Clojure genauso wie die ID-Funktion 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)) 

Von dem, was ich in Haskell sehen - idis used when using lenses und ist used in other higher order functions.

Meine Frage ist (abgesehen von der offensichtlichen Art Systemunterschiede) Ist die identity Funktion in Clojure die gleiche Nutzung und Zweck wie die in Haskell id Funktion hat?

Warum, frage ich, wenn ich bei the following example eines Lens in Clojure aussehen - wir sehen Id in Bezug auf functor definiert:

(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 fühle ich mich wie ich etwas fehlt bin.

+2

Die Definition von 'Id' in clojure entspricht dem Identitätsfunktor in Haskell. – bennofs

Antwort

6

Die id Funktion in Haskell ist die I combinator of lambda calculus. Es ist die triviale Funktion:

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

Es ist useful die Art und Weise, dass 0 oder die leere Liste nützlich sind.

Die Funktion identity in Clojure ist äquivalent, da sie ihr Argument unverändert zurückgibt.

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

Andere Begriffe z.B Identity monads usw. werden nicht direkt mit der Funktion id verbunden.