Clojure中isClose函数调用返回true的原因是什么?
问题分析:为什么Clojure函数调用结果为true?
你写的isClose函数存在括号使用错误,导致匿名函数的逻辑和你预期的完全不一样。
先看你的代码:
user=> (defn isClose [t1] (fn [t2] (and (<= (- t1 t2) 20)) (<= (- t2 t1) 20))) #'user/isClose user=> ((isClose 50) 10) true
这里的核心问题是匿名函数的函数体包含两个独立表达式:
- 第一个表达式:
(and (<= (- t1 t2) 20))—— 这个and只包裹了一个条件,计算结果是false,但这个结果会被直接丢弃 - 第二个表达式:
(<= (- t2 t1) 20)—— 这是匿名函数实际返回的结果,计算时(- 10 50)得到-40,(<= -40 20)的结果是true
所以最终调用返回的是第二个表达式的结果,也就是true。
而你预期的逻辑是两个条件通过and同时判断,正确的写法应该把两个条件都放在and的括号内:
(defn isClose [t1] (fn [t2] (and (<= (- t1 t2) 20) (<= (- t2 t1) 20))))
此时调用((isClose 50) 10)就会计算:
(and (<= 40 20) (<= -40 20))
结果为false,和你预期一致。
内容的提问来源于stack exchange,提问作者mmachenry
相关产品推荐
相关产品推荐

