在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 example的Lens 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)))))
所以我觉得我错过了什么。
答案 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
函数没有直接关联。