haw*_*eye 8 haskell identity clojure lenses
在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))
Run Code Online (Sandbox Code Playgroud)
从我在Haskell中看到的内容 - id 在使用镜头时使用,并用于其他更高阶的功能.
我的问题是(除了明显的类型系统的差异)是否identityClojure中的函数具有相同用途和目的为id在Haskell功能?
为什么我要问的是当我在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)))))
Run Code Online (Sandbox Code Playgroud)
所以我觉得我错过了什么.
将id在Haskell功能是演算的我的组合子.它是trival函数:
-- | Identity function.
id :: a -> a
id x = x
Run Code Online (Sandbox Code Playgroud)
这是非常有用的是0或空列表是有用的方式.
identityClojure中的函数是等效的,因为它返回其参数未经修改.
(defn identity
"Returns its argument."
{:added "1.0"
:static true}
[x] x)
Run Code Online (Sandbox Code Playgroud)
其他概念例如Identitymonad等与该id功能没有直接关系.