Clojure中的函数组合?

Sta*_*ked 35 clojure

Clojure可以像Haskell那样实现(g∘f)构造g . f吗?我目前正在使用类似的解决方法(fn [n] (not (zero? n))),这不是很好:)

Mic*_*zyk 54

有一个函数来做到这一点clojure.corecomp.例如

((comp not zero?) 5)
; => true
Run Code Online (Sandbox Code Playgroud)

您可能还想考虑使用->/ ->>,例如

(-> 5 zero? not)
; => true
Run Code Online (Sandbox Code Playgroud)

  • 当你在Haskell中做"currying"时,一定要使用`partial`.所以对于map/reduce,你需要做`(让[reducer(comp(partial reduce +)(partial map get-value))](reducer my-things))` (3认同)
  • `comp not`也可以用`complement`代替:`((补零?)5)` (2认同)

Bri*_*per 13

您可以使用Clojure的读取器 - 宏快捷方式为匿名函数重写您的版本,减少击键次数.

user=> (#(not (zero? %)) 1)
true
Run Code Online (Sandbox Code Playgroud)

对于撰写not和其他功能的具体情况,您可以使用complement.

user=> ((complement zero?) 1)
true
Run Code Online (Sandbox Code Playgroud)

使用not结合whenif足够的常见if-notwhen-not是核心功能.

user=> (if-not (zero? 1) :nonzero :zero)
:nonzero
Run Code Online (Sandbox Code Playgroud)