范围可以由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.
)
)
)
答案 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))