Clojure中的identity函数与Haskell中的id函数具有相同的用法和用途吗?

时间:2014-09-28 11:37:23

标签: haskell clojure identity lenses

在Clojure中我们有identity函数。它is used as follows

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 is used when using lenses并且是used in other higher order functions

我的问题是(除了显而易见的Type系统差异) Clojure中的identity函数与Haskell中的id函数具有相同的用法和用途吗? < / p>

为什么我要问的是当我查看the following exampleLens 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)))))

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

1 个答案:

答案 0 :(得分:6)

Haskell中的id函数是I combinator of lambda calculus。这是trival函数:

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

0 {或空列表有用的方式是useful

Clojure中的identity函数是等效的,因为它返回未修改的参数。

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

例如Identity monads等其他概念与id函数没有直接关联。