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
在使用透镜时使用,在其他高阶函数中也使用。
我的问题是(除了明显的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)))))
所以我觉得我错过了什么。
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
函数。