Clojure中的identity函数是否与Haskell中的id函数具有相同的用法和目的



在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在使用透镜时使用,在其他高阶函数中也使用。

我的问题是(除了明显的Type系统差异之外)Clojure中的identity函数与Haskell中的id函数有相同的用法和目的吗

我问这个问题的原因是,当我看下面Clojure中Lens的例子时,我们看到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)))))

所以我觉得我错过了什么。

Haskell中的id函数是lambda演算的I组合子。这是三重功能:
-- | Identity function.
id :: a -> a
id x = x

这是有用的方式,0或空列表是有用的。

Clojure中的identity函数的等效之处在于它未经修改地返回其参数。

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

例如Identity单元等的其他概念不直接连接到id函数。

最新更新