8

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

我的问题是(除了明显的类型系统差异) Clojure 中的函数是否与Haskellidentity中的函数具有相同的用途和目的?id

为什么我要问的是,当我查看Clojure中的以下镜头示例时- 我们看到定义为:Idfunctor

(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)))))

所以我觉得我错过了一些东西。

4

1 回答 1

8

idHaskell 中的函数是lambda calculus 的 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

于 2014-09-28T11:58:03.250 回答