【问题标题】:Compose multiple predicate functions into one将多个谓词函数组合为一个
【发布时间】:2018-01-20 11:11:01
【问题描述】:

是否可以作例如:

(defn- multiple-of-three? [n] (zero? (mod n 3))
(defn- multiple-of-five? [n] (zero? (mod n 5))

进入:

multiple-of-three-or-five?

所以我可以用它来过滤:

(defn sum-of-multiples [n]
  (->> (range 1 n)
       (filter multiple-of-three-or-five?)
       (reduce +)))

我也不想这样定义:

(defn- multiple-of-three-or-five? [n]
  (or (multiple-of-three? n)
      (multiple-of-five? n)))

例如,使用 Javascript 模块 Ramda 可以这样实现:http://ramdajs.com/docs/#either

const multipleOfThreeOrFive = R.either(multipleOfThree, multipleOfFive)

【问题讨论】:

  • 您需要执行or,您可以将现有的两个表达式合并为一个新的multiple-of-three-or-five?= (or (zero? (mod n 3)) (zero? (mod n 5))),这将消除另外1-2个函数调用。跨度>
  • 是的,但是想象一下 2 个更复杂的不同含义的谓词函数。最好把它们分开。我只是想了解如何在 clojure 中实现它(即使存在库)。
  • 好 ol' fizzbuzz 嗯?

标签: clojure functional-programming composition


【解决方案1】:

当然,在 Clojure 中这是some-fn

(def multiple-of-three-or-five?
  (some-fn multiple-of-three? multiple-of-five?))
(multiple-of-three-or-five? 3)  ; => true
(multiple-of-three-or-five? 4)  ; => false
(multiple-of-three-or-five? 5)  ; => true

【讨论】:

  • 太好了,这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
相关资源
最近更新 更多