如何在clojure中检查值是否落入范围内

时间:2015-01-05 13:51:38

标签: clojure

范围可以由maxInclude,maxExclude,minInclude,minExclude

定义
(defn check-range [value maxInclude maxExclude minInclude minExclude] ...)

以下情况应该成立。

(check-range 100 100 nil nil 10) ;; should return true since 100<=100 and 100>10
(check-range 100 nil 200 nil 10) ;; should return true since 100<200 and 100>10
(check-range 100 100 nil 101 nil) ;; should return false since 100<=101 is not true

有没有简单的解决方案?我正在使用一个看起来像命令式解决方案的长代码。我认为在clojure中必须有一些不错的解决方案。

更新:我的代码如下,但不完整,需要帮助才能完成

(defn check-range [value maxInclude maxExclude minInclude minExclude]
  ( 
   let [value1 (if (and maxInclude (< value maxInclude)) false true)
               value2 (if (and maxExclude (<=  value maxExclude)) false true)
               value3 (if (and minInclude (> value minInclude)) false true)
               value4 (if (and minExclude (>=  value minExclude)) false true)
               ]
         ;;; then how to combine value1,2,3,4 into final result as false or true.
     )
    )
  )

1 个答案:

答案 0 :(得分:0)

我不确定某个范围的含义是两者包含性和独占性最大值(或类似地,最小值)。看起来这些选项应该是互斥的,这表明你不应该让客户选择两者。否则,您如何决定是否更重要的是包含赢或排除?选择似乎必须非常武断。

我建议以不同的方式构建范围会更好。这样做的另一个好处是可以避免你所讨论的所有nil箍跳过,让用户明确他们正在制作的那种范围。

也许是这样的:

(defn make-range-checker [bottom-check top-check] 
  (fn [n]
    (and (bottom-check n)
         (top-check n))))

因此,对于最初的3个示例,您可以执行类似这样的操作来创建范围检查函数,您可以将其应用于100的输入:

(make-range-checker (partial < 10) (partial >= 100))
(make-range-checker (partial < 10) (partial > 200))
(make-range-checker (partial <= 100) (partial > 101))

(你的第三个例子不正确,顺便说一下:“100&lt; = 101不是真的”)

有人想要创建一个在任一方向上延伸到无穷大的范围,只需传递一个始终返回true的谓词。

(make-range-checker (partial < 10) (constantly true))
(make-range-checker (constantly true) (partial > 10))