我无法理解的一些意图吗?在Clojure中的功能。为什么有些?在Clojure中将参数设为false时返回true?
我需要一些函数(内置),它需要(无或假)时返回false。
这里是例子:
(some? "1")
=> true
(some? nil)
=> false
(some? false) ;;Which is odd!!
=> true
我无法理解的一些意图吗?在Clojure中的功能。为什么有些?在Clojure中将参数设为false时返回true?
我需要一些函数(内置),它需要(无或假)时返回false。
这里是例子:
(some? "1")
=> true
(some? nil)
=> false
(some? false) ;;Which is odd!!
=> true
检查的some?
文档:
(some? x) Returns true if x is not nil, false otherwise.
false
绝对不是nil
因此(some? false)
回报true
。
这是nil?
(= (some? x) (not (nil? x))
由于@delta建议,您可以使用boolean
检查自己是不是nil
或false
的补充。
我会补充一点,在语义上'some?'完全对应于它的标题,这意味着它检查,该值是* something *,而只有'nil'在clojure中被认为是* nothing。很明显,“假”是某种东西。所以这种行为没有什么奇怪的。 – leetwinski
@leetwinski然而,人们常常会感到困惑,因为在谓词返回的“某些”逻辑真值(即非假)被视为匹配。尽管如此,命名也是一致的,他说:“给我一些匹配谓词的元素”。另外'some->'的命名是一致的,它又将“false”当作“some?”来处理。 –
确实..我宁愿将它命名为“某事?”真的......但是...... Rich知道得更好) – leetwinski
就更简单了,使用IF:
user=> (if "1" true false)
true
user=> (if nil true false)
false
user=> (if false true false)
false
虽然有做你所要求的方法不止一种,我觉得最简单的就是使用truthy?
& falsey?
功能from the Tupelo library:
真相不含糊
Clojure与Java和Lisp结合在一起。不幸的是,这两个世界都有不同的真理观点,所以Clojure接受虚假的 和零假。然而,有时你想逻辑 值对象转换成文字true或false值,所以我们提供了一个简单的方法 做到这一点:
(truthy? arg)
Returns true if arg is logical true (neither nil nor false);
otherwise returns false.
(falsey? arg)
Returns true if arg is logical false (either nil or false);
otherwise returns false. Equivalent to (not (truthy? arg)).
由于truthy?和虚伪?是功能(而不是特殊形式或宏),我们可以用它们作为参数来筛选或任何其他地方所需要高阶功能:
(def data [true :a 'my-symbol 1 "hello" \x false nil])
(filter truthy? data)
;=> [true :a my-symbol 1 "hello" \x]
(filter falsey? data)
;=> [false nil]
(is (every? truthy? [true :a 'my-symbol 1 "hello" \x]))
(is (every? falsey? [false nil]))
(let [count-if (comp count keep-if) ]
(let [num-true (count-if truthy? data) ; <= better than (count-if boolean data)
num-false (count-if falsey? data) ] ; <= better than (count-if not data)
(is (and (= 6 num-true)
(= 2 num-false))))))
我认为所需的函数是'truthy?',而不是'falsey?'。 – Thumbnail
考虑到逻辑真理在所有条件形式中都受到语言本身的尊重,所以我认为这些谓词的可读性至多99.99%。 “假?”完全是“不”。 IDK是keep-if的impl,但考虑惯用的'(过滤器身份数据)','(过滤器不是数据)' - 我不低估这一点,因为这是通过SICP风格的上下文重定义来增加可读性的好例子,但它会为了学习的目的,如果你在这里提供了单行实现而不是链接到它,那会更好。 –
你是正确的,主要目的是可读性,以便代码文本更真实地说明它打算做什么。这对于学习Clojure的人特别有用。使用'not'不难读,但是不存在与“truthy?”相反的情况。当然,因为它是一种特殊的形式,所以不能使用if。因此,薄包装fn的'truthy?'和'falsey?'强制为'true' /'false'。虽然'boolean'有效,但在我注意到它之前,我已经使用了Clojure 2年了!即使这样,文档也会使其看起来像是“投射”,直到您测试并验证其所有行为。 –
有趣的是,'零'呢和'some?'完全一样。 – S4M
@ S4M不,它没有。 '(nil?nil)'返回'true',而'(some?nil)'返回'false'。 –
@PiotrekBzdyl你说得对,它是'(not(nil?false))'返回'true'和'(not(nil?nil))'返回'false'。 – S4M